我们公司的项目是用 django+supervisor+gunicorn 配的,
启着几个 workers 监听着:
workers = multiprocessing.cpu_count() * 2 + 1
worker_class = 'sync'
但是现在我们的一些统计报表导出会导致我们的服务器 cpu 报警、mysql 服务器 cpu 也会经常报警。
这种情况下是
1.升级一下 cpu 配置从目前的 4 核升级到 8 核,
2.还是买一个同样配置的服务器重新部署一套,来个负载均衡。
哪一个更好,想着是那种一劳永逸的解决。
我目前更倾向于后者总感觉 python 线程没有真正把多核 cpu 的资源利用起来。
各位大佬给个建议
1
julyclyde 2021-07-07 16:30:34 +08:00
gunicorn 也可以选 worker 类型的啊
如果是线程,应该是不会充分利用 cpu 的 |
2
deplives 2021-07-07 16:31:51 +08:00
你不知道 python 的多线程是在一个核心上跑的么?
|
3
comphilip 2021-07-07 16:32:36 +08:00
CPython 不会,应该有 Global Interpreter Lock( https://realpython.com/python-gil/)。对于衍生品如 pypy,则可以。对于 CPython,多核的利用是利用子进程。
|
4
houzhiqiang 2021-07-07 18:12:49 +08:00
python(cpython) 多进程会利用多核,多线程不行,默认的 pypy 也一样,好像 pypy 有个 no gil 的实验版
|
5
jones2000 2021-07-07 19:23:11 +08:00
直接 docker 上部署,不行就多部署几套。
|
6
streamrx 2021-07-08 03:25:11 +08:00 via iPhone
不会
|
7
hxysnail 2021-07-08 08:53:17 +08:00
由于 GIL 全局锁的存在,Python 线程是没有办法利用到多核 CPU 的处理能力的。如果你的应用是计算密集型,需要充分利用多核处理器,建议开多进程。这里有篇文章可以参考一下: https://fasionchan.com/python-source/virtual-machine/gil/
|
8
dayeye2006199 2021-07-08 09:20:05 +08:00
你这代码是多进程而非多线程。
CPU 报警得分析分析原因: 1. 是否是因为单个 worker 的 CPU 占用率过高?单个 worker 内部的任务代码是怎么样的?有些代码是可以释放 GIL 的,例如 numpy 的向量化,一个 process 也可以利用多核 CPU 2. 是否是因为 job 太多导致整体负载高? 3. 负载是一直很高还是瞬时有大量任务进来导致短时负载? 4. 其他原因等等 1 的话,如果单个 worker 就能跑满 CPU,建议减少 worker 的数量,同时 scale up,换用更强的 CPU 2 的话,scale out,堆更多的机器 3 的话,建议考虑使用 MQ 来异步处理任务,避免瞬时负荷过大 |
9
frostming 2021-07-08 14:17:25 +08:00
8 楼+1
worker_class = 'sync' 分别是多进程方式,楼上莫着急回答 |