ps aux和-ef之间的CPU使用差异

时间:2013-12-10 03:15:55

标签: python multithreading ps

[user@centos-vm-02 ~]$ ps aux|grep python
user      4182  0.0  0.0   9228  1080 ?        Ss   02:00   0:00 /bin/sh -c cd data/trandata && /usr/local/bin/python2.7 main.py >> /dev/null 2>&1
user      4190  0.1  0.1 341108 10740 ?        Sl   02:00   0:52 /usr/local/bin/python2.7 main.py
user      4205  166  1.6 1175176 129312 ?      Sl   02:00 901:39 /usr/local/bin/python2.7 main.py
user     10049  0.1  0.1 435856 10712 ?        Sl   10:21   0:04 /usr/local/bin/python2.7 main.py
user     10051 71.1  2.5 948248 207628 ?       Sl   10:21  28:42 /usr/local/bin/python2.7 main.py
user     10052 51.9  1.9 948380 154688 ?       Sl   10:21  20:57 /usr/local/bin/python2.7 main.py
user     10053 85.9  0.9 815104 76652 ?        Sl   10:21  34:41 /usr/local/bin/python2.7 main.py
user     11166  0.0  0.0 103240   864 pts/1    S+   11:01   0:00 grep python
[user@centos-vm-02 ~]$ ps -ef|grep python
user      4182  4174  0 02:00 ?        00:00:00 /bin/sh -c cd /data/trandata && /usr/local/bin/python2.7 main.py >> /dev/null 2>&1
user      4190  4182  0 02:00 ?        00:00:52 /usr/local/bin/python2.7 main.py
user      4205  4190 99 02:00 ?        15:01:46 /usr/local/bin/python2.7 main.py
user     10049     1  0 10:21 ?        00:00:04 /usr/local/bin/python2.7 main.py
user     10051 10049 71 10:21 ?        00:28:47 /usr/local/bin/python2.7 main.py
user     10052 10049 51 10:21 ?        00:21:01 /usr/local/bin/python2.7 main.py
user     10053 10049 85 10:21 ?        00:34:45 /usr/local/bin/python2.7 main.py
user     11168 10904  0 11:01 pts/1    00:00:00 grep python

正如我们所见,我启动了一个python进程,它将进行多进程,并且在进程内部启动多线程,并在线程内部启动多线程。

这样的处理树:
main_process
--sub_process
----线程1
------ sub_thread
------ sub_thread
------ sub_thread
------ sub_thread
----线程2
---- thread3
--sub_process
----......
在图片中,pid-4205在ps aux和ps -ef中显示不同的CPU使用率,一个是166,另一个是99,166也显示在顶部-c。
我保证pid-4205是子进程之一,这意味着它不能在python中使用超过100%的带GIL的CPU。
所以这就是我的问题,为什么ps -ef和ps aux显示出差异。

1 个答案:

答案 0 :(得分:2)

这只是一个抽样工件。假设一家工厂每小时生产一辆汽车。如果你在汽车制造之前到达并在汽车制造完成后立即离开,你可以看到两辆汽车在一个多小时的时间内制造,导致你认为工厂的运行能力接近双倍。

更新:让我试着澄清一下这个例子。假设一家工厂每小时生产一辆汽车。它无法每小时生产一辆以上的汽车。如果你从7:59到9:01观看工厂,你会看到两辆车(一个在8点钟,一个在9点钟)在一个多小时(62分钟)内完成。因此,您估计工厂每小时生产约两辆汽车,几乎是实际产量的两倍。这就是这里发生的事情。这是由top在错误的时间检查CPU计数器引起的采样工件。