Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

为什么 Python 网络请求使用线程池反而更慢了

我在一台树莓派上开起了一个 Nginx 服务

sudo apt install nginx
─➤  sudo service nginx status  
● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-01-03 03:46:08 UTC; 12min ago
       Docs: man:nginx(8)
   Main PID: 138419 (nginx)
      Tasks: 5 (limit: 4435)
     CGroup: /system.slice/nginx.service
             ├─138419 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             ├─138420 nginx: worker process
             ├─138421 nginx: worker process
             ├─138422 nginx: worker process
             └─138423 nginx: worker process

Jan 03 03:46:08 RaspberryPi systemd[1]: Starting A high performance web server and a reverse proxy server...
Jan 03 03:46:08 RaspberryPi systemd[1]: Started A high performance web server and a reverse proxy server.

在另一台机器上请求这个 Nginx,代码如下:

from concurrent.futures import ThreadPoolExecutor
import requests

def func():
    requests.get('http://192.168.31.203')
    
pool = ThreadPoolExecutor(max_workers=10)

for i in range(3000):
    pool.submit(func)

当 max_workers = 1 的时候,耗时:5 秒:

─➤  time python test_threading_pool.py
python test_threading_pool.py  3.85s user 0.25s system 70% cpu 5.814 total

当 max_workers = 10 的时候,耗时:10 秒:

➤  time python test_threading_pool.py
python test_threading_pool.py  10.77s user 0.98s system 114% cpu 10.273 total

非常差异的是,反而变慢了!

图片.png

python 版本

图片.png

爬虫机器配置:
操作系统:Ubuntu20.04
cpu:AMD 5700G 8核心16线程
内存:32GB DDR4 3200MHZ
网卡:intel AX200

图片.png

树莓派4B 配置
操作系统:Ubuntu20.04
cpu:博通 BCM2711,1.5 GHz 64 位 4 核心 Cortex-A72(ARM v8)
内存:4 GB RAM
网卡:千兆以太网

图片.png

即便算上创建线程池和对应线程的开销和线程切换的开销,也不至于这么慢吧!

每次上下文切换需要几十纳秒到数微秒之间。 这个时间还是相当客观的,在高并发场景中,进程下上文切换次数较多,很容易出现大量CPU时间浪费在寄存器,内核栈以及虚拟内存等资源的保存以及恢复上,从而大大减少了进程运行的实际时间。这也是导致系统平均负载升高的原因之一。

参考资料:
CPU 上下文切换
提问的智慧

Enregistrer un commentaire

0 Commentaires