为什么不同云服务提供商的Linux设置下,Python线程的负载平均值不同,而规格相同?
我们有一个用Python写的应用程序,它通过线程和inotify监视器来轮询目录。我们一直在Voxel提供的云服务器上运行这个应用程序(http://www.voxel.net)。现在我们正在测试另一个云服务器提供商StormOnDemand(http://stormondemand.com),但当我们在这个新服务器上运行应用程序时,发现它的负载平均值比在Voxel云服务器上高很多,尽管两者的配置差不多(下面有更多设置的细节)。我们还确保在测试时,服务器没有处理其他负载。
我写了一个简单的测试应用程序(test_threads.py - 附件,或者可以参考http://pastebin.com/xGQU7JD0),它通过启动循环的线程来模拟我们遇到的问题,每次循环都睡眠一段用户定义的时间。这个程序需要两个参数,一个是要启动的线程数量,另一个是间隔时间。
当我运行命令“python test_threads.py 50 0.1”大约10分钟后,
负载平均结果:
StormOnDemand:
$ uptime 18:46:22 up 7:29, 6 users, load average: 4.43, 4.16, 2.93
Voxel:
$ uptime 18:48:14 up 9 days, 15:09, 9 users, load average: 0.51, 0.47, 0.43
可以看到,StormOnDemand服务器的负载平均值高得多。
Python版本:
StormOnDemand - 2.6.5
Voxel - 2.6.5
服务器配置:
StormOnDemand - 8个Intel(R) Xeon(R) CPU E5506 @ 2.13GHz;16GB内存;230GB硬盘(Storm裸金属服务器)
Voxel - 7个Intel(R) Xeon(R) CPU L5640 @ 2.27GHz;14GB内存;200GB硬盘(VoxCloud服务器)
操作系统:
StormOnDemand - Ubuntu 10.04 - 2.6.36-rc8101910 #1 SMP Tue Oct 19 19:18:34 UTC 2010 x86_64 GNU/Linux
Voxel - Ubuntu 10.04 - 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux
虚拟化方法:
StormOnDemand - 不太确定,但我觉得他们可能使用Xen
Voxel - 不确定,但我们使用的镜像看起来像是标准的Ubuntu 10.04服务器
如果有人能提供为什么负载会高很多的建议,或者如何进一步调试这个问题,我将非常感激。
1 个回答
一般来说,在单个Python解释器中评估机器的多线程能力并不是一个好主意,因为有一个叫做全局解释器锁(GIL)的东西:在任何时候,解释器的线程中只有一个线程可以运行。
在Linux系统中,负载平均值是可运行线程数量的指数平均值,带有不同的衰减因子。这意味着在StormOnDemand系统上,肯定还有其他进程同时在运行(4个可运行的线程 - 1个Python = 3个其他线程)。(需要注意的是,即使是4个可运行的进程,在一个8核的系统上也并不算高负载。)
为了提高你的测量准确性,你可以在进程退出前,从/proc/self/stat中读取该进程被调度的时钟滴答数。这将帮助你比较两个主机的CPU速度。
较高的负载平均值可能还与虚拟机管理程序(XEN)以及在虚拟化环境中运行有关。较高的平均值并不一定意味着性能有问题:是否存在问题取决于你关注的关键性能指标是什么。
例如,如果你想找出主机的最大吞吐量(可用容量),你需要用一个代表性的工作负载去充分利用它们。如果你关心响应速度(也就是它对刺激反应的快慢),你需要测量响应时间(最好在接近你的最终用户的地方测量,这样可以包括网络延迟)。
不过,比较中最重要的标准可能是合同方面的,也就是你的服务提供商与你签署的服务水平协议。这份协议应该包含服务水平测量的技术描述,并集中在对你的应用程序至关重要的指标上。