haproxy(七)多线程使用

时间:2024-05-21 12:35:29

haproxy(七)多线程使用

现象

HAProxy绑定4核cpu、8核cpu、16核cpu,压测的时候,都会出现CPU 100%被使用的情况。

追查过程

1. 通过 mpstat  -P ALL 1 命令查看cpu 都用在哪里,可以看到cpu都绝大部分用在 sys态上。

haproxy(七)多线程使用

 

2. 通过 strace -p pid -c 查看HAProxy 进程那个系统调用占用cpu 最多,看到cpu 都用在了 connect系统调用上。

haproxy(七)多线程使用

 

3. HAProxy连接后端会使用connect系统调用,查看HAProxy配置,发现HAProxy连接后端就只有两个后端,即这种情况: vegeta(40台压测机器)-》HAProxy-》httptest(2台HAProxy后端),其中 HAProxy连接后端最多只能有63000个端口左右,大量的连接积压在HAProxy机器上,导致cpu被耗尽了。


多线程使用方法

nbproc <number>
cpu-map <“all”|”odd”|”even”|process_num> <cpu-set>…

这2个配置是密切相关的,nbproc是指启动多少个haproxy进程。

[plain] view plain copy
  1. #nbproc设置为4,讲启动4个进程  
  2. haproxy  11472  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  3. haproxy  11473  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  4. haproxy  11474  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  5. haproxy  11475  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  6.   
  7. #查看pid文件,也可以看到四个进程ID  
  8. # cat /run/haproxy.pid   
  9. 11472  
  10. 11473  
  11. 11474  
  12. 11475  
cpu-map是将进程绑定到特定的CPU上,这个好处是防止多进程对CPU的抢占,可以提升少量性能。这个配置指令有2个参数,第一参数是进程序号,从1开始。第二个参数是CPU序号,从0开始。举例说明如果将进程绑定到指定的CPU上的。

[plain] view plain copy
  1. #查看本机的CPU个数,同时也可以看到CPU的序号从0开始  
  2.   
  3. # cat /proc/cpuinfo | grep processor  
  4. processor    : 0  
  5. processor    : 1  
  6. processor    : 2  
  7. processor    : 3  
[plain] view plain copy
  1. # 逐一指定  
  2. cpu-map 1 0  
  3. cpu-map 2 1  
  4. cpu-map 3 2  
  5. cpu-map 4 3  
  6. cpu-map 5 4 //该条超过nbproc的数量,将被忽略  
  7.   
  8. #全部的进程由0号cpu处理。  
  9. cpu-map all 0  
  10.   
  11. #奇数的进程有0号cpu处理,偶数的进程有1号cpu处理。  
  12. cpu-map odd 0  
  13. cpu-map even 1  
后端绑定

[plain] view plain copy
  1. frontend access_http  
  2.    bind 0.0.0.0:80  
  3.    bind-process 1  
  4. frontend access_https  
  5.    bind 0.0.0.0:443 ssl crt /etc/yourdomain.pem  
  6.    bind-process 2 3 4  

现象

HAProxy绑定4核cpu、8核cpu、16核cpu,压测的时候,都会出现CPU 100%被使用的情况。

追查过程

1. 通过 mpstat  -P ALL 1 命令查看cpu 都用在哪里,可以看到cpu都绝大部分用在 sys态上。

haproxy(七)多线程使用

 

2. 通过 strace -p pid -c 查看HAProxy 进程那个系统调用占用cpu 最多,看到cpu 都用在了 connect系统调用上。

haproxy(七)多线程使用

 

3. HAProxy连接后端会使用connect系统调用,查看HAProxy配置,发现HAProxy连接后端就只有两个后端,即这种情况: vegeta(40台压测机器)-》HAProxy-》httptest(2台HAProxy后端),其中 HAProxy连接后端最多只能有63000个端口左右,大量的连接积压在HAProxy机器上,导致cpu被耗尽了。


多线程使用方法

nbproc <number>
cpu-map <“all”|”odd”|”even”|process_num> <cpu-set>…

这2个配置是密切相关的,nbproc是指启动多少个haproxy进程。

[plain] view plain copy
  1. #nbproc设置为4,讲启动4个进程  
  2. haproxy  11472  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  3. haproxy  11473  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  4. haproxy  11474  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  5. haproxy  11475  0.0  0.0  56520  1228 ?        Ss   08:57   0:00 ./haproxy -f /usr/local/haproxy/conf/haproxy.cfg  
  6.   
  7. #查看pid文件,也可以看到四个进程ID  
  8. # cat /run/haproxy.pid   
  9. 11472  
  10. 11473  
  11. 11474  
  12. 11475  
cpu-map是将进程绑定到特定的CPU上,这个好处是防止多进程对CPU的抢占,可以提升少量性能。这个配置指令有2个参数,第一参数是进程序号,从1开始。第二个参数是CPU序号,从0开始。举例说明如果将进程绑定到指定的CPU上的。

[plain] view plain copy
  1. #查看本机的CPU个数,同时也可以看到CPU的序号从0开始  
  2.   
  3. # cat /proc/cpuinfo | grep processor  
  4. processor    : 0  
  5. processor    : 1  
  6. processor    : 2  
  7. processor    : 3  
[plain] view plain copy
  1. # 逐一指定  
  2. cpu-map 1 0  
  3. cpu-map 2 1  
  4. cpu-map 3 2  
  5. cpu-map 4 3  
  6. cpu-map 5 4 //该条超过nbproc的数量,将被忽略  
  7.   
  8. #全部的进程由0号cpu处理。  
  9. cpu-map all 0  
  10.   
  11. #奇数的进程有0号cpu处理,偶数的进程有1号cpu处理。  
  12. cpu-map odd 0  
  13. cpu-map even 1  
后端绑定

[plain] view plain copy
  1. frontend access_http  
  2.    bind 0.0.0.0:80  
  3.    bind-process 1  
  4. frontend access_https  
  5.    bind 0.0.0.0:443 ssl crt /etc/yourdomain.pem  
  6.    bind-process 2 3 4