如何知道运行多少个进程最有效率?
grep 'physical id' /proc/cpuinfo | sort -u | wc -l
grep 'core id' /proc/cpuinfo | sort -u | wc -l
grep 'processor' /proc/cpuinfo | sort -u | wc -l
output
2
10
40
更多信息
cat /proc/cupinfo
shows
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
stepping : 4
microcode : 0x416
cpu MHz : 2499.892
cache size : 25600 KB
physical id : 0
siblings : 20
core id : 0
cpu cores : 10
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
...
processor : 39
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz
stepping : 4
microcode : 0x416
cpu MHz : 2499.892
cache size : 25600 KB
physical id : 1
siblings : 20
core id : 12
cpu cores : 10
apicid : 57
initial apicid : 57
fpu : yes
fpu_exception : yes
cpuid level : 13
Linux cpu parallel-execution 并行
Answers
从/proc/cupinfo信息可以看出,E5-2670V2有10核心(cpu cores)20超线程(siblings),你的服务器是双路(两个CPU),总计就是20核心40超线程.
要最大化程序的性能,就应该避免程序被网络或者文件IO阻塞,也应该避免CPU出现过多的上下文切换.
拿Linux上的Nginx来说,Nginx利用内核epoll实现网络异步,小文件用sendfile,大文件用AIO线程池,来尽量避免工人进程被阻塞,工作进程数则设为CPU核心数来避免CPU频繁上下文切换.
同理,运行在PHP-FPM的PHP代码,应该避免使用curl等可能会产生较长网络IO的代码,对于一些经过PHP验证身份后输出的附件,为了避免文件阻塞,可以用
header("X-Accel-Redirect: $file_path");
委托给Nginx返回给客户端,最后,没了网络和文件IO的阻塞,就只剩下计算,这时PHP-FPM也是计算密集型应用,所以PHP-FPM工作进程数也可以设为CPU核心数.
可以在这台40超线程的服务器跑LAMP服务,看哪种情况下性能最佳:
10 Nginx + 30 PHP-FPM
15 Nginx + 25 PHP-FPM
40 Nginx + 40 PHP-FPM