题目有点标题党了:P
测试目标
用 Python 和 Go 的并发编程实现类似 Ansible 的 ping 命令,对比不同并发规模的执行效率。
测试环境
i7 7500 双核超线程的笔记本,win10系统。
测试结果
主机数 | Ansible | Python multiprocessing | Python threading | Python gevent | Go goroutine |
---|---|---|---|---|---|
10 | 14s | 5s | 0.4s | 0.4s | 120ms |
100 | 34s | MemoryError | 1.5s | 1.5s | 226ms |
1000 | [Errno 24] Too many open files | - | 19s | 19s 偶有连接异常 | 11s |
测试说明
- 我记录的是多次执行的最快时间,Ansible 尤其不稳定。
- Ansible 运行时间包含了解析 hosts 配置文件的时间,其他程序没有这个消耗。
测试总结
- 简单翻了一下 Ansible 的源码,通过 fork 进程的方式实现并行,并行数量超过 CPU 核数以后 CPU 打满,性能低,不适合大规模任务执行。
- Python 的多线程和协程效率差不多,资源消耗为单核打满。
- Go 的 goroutine 处理大规模并发性能优势明显,且 CPU 资源消耗更少,1000 个并发启动时孵化 goroutine 冲到 40%,很快进入等待I/O状态,下降到 1%以下。