骞没蕴 发表于 2018-11-8 08:34:01

为nginx 绑定CPU

  前文所讲,taskset 能为进程绑定CPU,但毕竟是事后的绑定,nginx 能够在软件内部实现该功能。
  本来淘宝的tengine很好的解决了这个问题,一行搞定
worker_cpu_affinity auto;  但是无奈编译tengine+ pagespeed 失败,只好研究一下nginx的绑定办法
  以四核CPU 为例,CPU 编号分别是
0001 0010 0100 1000  另一种情况是双核四线程,两个物理内核,表现出来也是四核,实际上是“伪四核”,是一种提高CPU效率的手段,通常都是intel CPU。虽然CPU编号不变,但是0001和0100实际是同一个物理核心。
  我们比较一下双核四线程、四核四线程以及四核八线程的区别就知道了。
  双核四线程
# cat /proc/cpuinfo|grep "core id"  
core id         : 0
  
core id         : 1
  
core id         : 0
  
core id         : 1
  四核四线程
# cat /proc/cpuinfo|grep "core id"  
core id         : 0
  
core id         : 1
  
core id         : 2
  
core id         : 3
  四核八线程
# cat /proc/cpuinfo|grep "core id"  
core id         : 0
  
core id         : 1
  
core id         : 2
  
core id         : 3
  
core id         : 0
  
core id         : 1
  
core id         : 2
  
core id         : 3
  nginx worker个数,官方建议使用物理CPU核心数,而不是逻辑核心数。
  假设双核四线程,那么就有2个nginx worker进程(第一三逻辑CPU一组,另外两个一组)
worker_cpu_affinity 0101 1010;  假设四核四线程,那么就有四个nginx worker进程,那么绑定就很简单了,挨个绑定:
worker_cpu_affinity 0001 0010 0100 1000;  假设四核八线程,那么还是四个nginx worker进程(第一五逻辑CPU一组,第二六一组,类推)
worker_cpu_affinity 0001000100100010 01000100 10001000;  如果不按照物理CPU核心的顺序绑定,比如双核四线程,
worker_cpu_affinity 0011 1100;  这样绑定会导致CPU切换比较频繁。
  如果是高端CPU,核心数会非常多,那么就会有很多个零,手动绑定虽然看起来很傻,也不太省心,但确实奏效。
  update 2016-01-31
  nginx-1.9.10 开始,增加 worker_cpu_affinity auto 功能。


页: [1]
查看完整版本: 为nginx 绑定CPU