[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显示出差异。
答案 0 :(得分:2)
这只是一个抽样工件。假设一家工厂每小时生产一辆汽车。如果你在汽车制造之前到达并在汽车制造完成后立即离开,你可以看到两辆汽车在一个多小时的时间内制造,导致你认为工厂的运行能力接近双倍。
更新:让我试着澄清一下这个例子。假设一家工厂每小时生产一辆汽车。它无法每小时生产一辆以上的汽车。如果你从7:59到9:01观看工厂,你会看到两辆车(一个在8点钟,一个在9点钟)在一个多小时(62分钟)内完成。因此,您估计工厂每小时生产约两辆汽车,几乎是实际产量的两倍。这就是这里发生的事情。这是由top
在错误的时间检查CPU计数器引起的采样工件。