引言
之前说到在 Linux 下使用 prozilla 进行下载加速,
其中一个原因就是 prozilla 是多线程程序,可以同时打开多个连接,而 wget 不是一个多线程的程序。
我多想了一下,那怎么判断一个程序进程是单线程还是多线程的?
根据 /proc/PID/task 下子目录个数来判断一个程序进程是否是多线程
下面来进行测试验证下:
1、使用 wget 下载一个文件,相关输出如下:
[root@iZ25p102vo3Z ~]# ps -ef | grep wget
root 31644 31570 0 15:10 pts/0 00:00:00 wget --limit-rate=20k http://xxx.xx
root 31646 31612 0 15:10 pts/2 00:00:00 grep --color=auto wget
[root@iZ25p102vo3Z ~]# ll /proc/31644/task
total 0
dr-xr-xr-x 6 root root 0 Feb 25 15:10 31644
可以看到/proc/31644/task/下只有一个目录,验证了 wget 是一个单线程程序。
2、使用 prozilla 下载一个文件,开启 10 个线程,相关输出如下:
[root@iZ25p102vo3Z ~]# ps -ef | grep proz
root 31659 31570 0 15:17 pts/0 00:00:00 proz -k=10 -f --max-bps=102400 http://xxx.xx
root 31686 31612 0 15:18 pts/2 00:00:00 grep --color=auto proz
[root@iZ25p102vo3Z ~]# ll /proc/31659/task/
total 0
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31659
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31667
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31668
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31669
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31670
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31671
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31672
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31673
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31674
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31675
dr-xr-xr-x 6 root root 0 Feb 25 15:18 31676
可以看到/proc/31659/task/
下有多个目录,验证了 prozilla 是一个多线程程序。
使用 ps -efL 命令
Ref
Linux: detect at runtime that a process have multiple threads