PHP-FPM優化及壓力測試

PHP-FPM優化及壓力測試

centos-logo-200

php fastcgi進程管理器,相比fastcgi靜態的喚起cgi,fpm能根據訪問的壓力動態的喚起cgi進程和銷燬以到達動態的調整cgi數量,這樣可以有效的使用內存。除此之外還有其它的一些優點,比如,fpm還可以平滑的重載php配置;由於fpm是使用Unix-Socket來和服務器通訊,所以也不用再配置cgi端口;fpm有更好的狀態輸出和slowlog日誌,502的時候能給出更多的錯誤細節。

 

本文談談有關PHP-FPM的配置細節以及基於一個實際環境來做壓力測試:

  1. 服務器配置如下:
  2. 4核心4G內存
  3. Nginx版本爲1.7.0
  4. PHP版本爲5.3.27

 

Nginx配置文件如下

  1. user www www;
  2. worker_processes 8;
  3. error_log /var/log/nginx/error.log warn;
  4. worker_rlimit_nofile 204800;
  5. pid logs/nginx.pid;
  6. events {
  7. use epoll;
  8. worker_connections 204800;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  14. '$status $body_bytes_sent "$http_referer" '
  15. '"$http_user_agent" "$http_x_forwarded_for"';
  16. access_log /var/log/nginx/access.log main;
  17. index index.shtml index.php index.html index.htm;
  18. server_names_hash_bucket_size 128;
  19. client_header_buffer_size 32k;
  20. open_file_cache max=204800 inactive=20s;
  21. ###我這邊測試,這個開啓後對php處理性能有15%提升###
  22. open_file_cache_valid 30s;
  23. open_file_cache_min_uses 1;
  24. large_client_header_buffers 4 32k;
  25. client_max_body_size 300m;
  26. sendfile on;
  27. tcp_nopush on;
  28. keepalive_timeout 60;
  29. tcp_nodelay on;
  30. server_tokens off;
  31. client_body_buffer_size 512k;
  32. fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;
  33. fastcgi_connect_timeout 300;
  34. fastcgi_send_timeout 300;
  35. fastcgi_read_timeout 300;
  36. fastcgi_buffer_size 64k;
  37. fastcgi_buffers 4 64k;
  38. fastcgi_busy_buffers_size 128k;
  39. fastcgi_temp_file_write_size 128k;
  40. fastcgi_cache TEST;
  41. ###這個開啓後感覺效果非常明顯,有效的降低cpu負載,提高了php的處理能力###
  42. fastcgi_cache_use_stale error timeout invalid_header http_500;
  43. fastcgi_intercept_errors on;
  44. fastcgi_cache_valid 200 302 1h;
  45. fastcgi_cache_valid 301 1d;
  46. fastcgi_cache_valid any 1m;
  47. fastcgi_cache_min_uses 1;
  48. gzip on;
  49. gzip_min_length 1k;
  50. gzip_buffers 4 16k;
  51. gzip_http_version 1.1;
  52. gzip_comp_level 2;
  53. gzip_vary on;
  54. include /usr/local/nginx/conf.d/*.conf;
  55. ssi on;
  56. ssi_silent_errors on;
  57. ssi_types text/shtml;
  58. upstream phpbackend {
  59. server unix:/dev/shm/php-fpm.sock weight=100 max_fails=10 fail_timeout=30;
  60. server unix:/dev/shm/php-fpm2.sock weight=100 max_fails=10 fail_timeout=30;
  61. server unix:/dev/shm/php-fpm3.sock weight=100 max_fails=10 fail_timeout=30;
  62. }
  63. server {
  64. listen 80;
  65. server_name 10.168.41.2 default backlog=204800;
  66. location / {
  67. root html;
  68. index index.html index.htm;
  69. }
  70. error_page 500 502 503 504 /50x.html;
  71. location = /50x.html {
  72. root html;
  73. }
  74. location ~ \.php$ {
  75. fastcgi_pass phpbackend;
  76. fastcgi_index index.php;
  77. fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
  78. include fastcgi_params;
  79. }
  80. }
  81. }

 

優化後的php-fpm配置如下:我開啓了3個php-fpm實例,每個實例爲60個進程,使用socket連接FastCGI,這個可以根據自己的服務器配置進行調整

  1. listen = /dev/shm/php-fpm.sock
  2. ###/dev/shm是內存文件系統,放在內存中肯定會快###
  3. pm.start_servers = 60
  4. pm.min_spare_servers = 40
  5. pm.max_spare_servers = 80
  6. ###Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2###
  7. pm.max_requests = 204800
  8. rlimit_files = 102400
  9. listen.backlog = 102400
  10. ###隊列等待長度,如果出現11: Resource temporarily unavailable錯誤,可以把這個值調高一點,分別對應系統內核backlog,nginx的backlog###

 

內核參數優化如下

  1. net.ipv4.tcp_max_tw_buckets = 250000
  2. ###同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息###
  3. net.ipv4.tcp_sack = 1
  4. ###通過有選擇地應答亂序接收到的報文來提高性能,讓發送者只發送丟失的報文段,(對於廣域網通信來說)這個選項應該啓用,但是會增加對CPU的佔用###
  5. net.ipv4.tcp_window_scaling = 1
  6. ###支持更大的TCP窗口 如果TCP窗口最大超過65535(64K)必須設置該數值爲1###
  7. net.ipv4.tcp_rmem = 4096 87380 4194304
  8. ###這個參數定義了TCP接收緩存(用於TCP接收滑動窗口)的最小值、默認值、最大值###
  9. net.ipv4.tcp_wmem = 4096 16384 4194304
  10. ###這個參數定義了TCP發送緩存(用於TCP發送滑動窗口)的最小值、默認值、最大值###
  11. net.core.wmem_default = 8388608
  12. ###這個參數表示內核套接字發送緩存區默認的大小###
  13. net.core.rmem_default = 8388608
  14. ###這個參數表示內核套接字接收緩存區默認的大小###
  15. net.core.rmem_max = 16777216
  16. ###這個參數表示內核套接字接收緩存區的最大大小###
  17. net.core.wmem_max = 16777216
  18. ###這個參數表示內核套接字發送緩存區的最大大小###
  19. net.core.netdev_max_backlog = 262144
  20. ###當網卡接收數據包的速度大於內核處理的速度時,會有一個隊列保存這些數據包,這個參數表示該隊列的最大值###
  21. net.core.somaxconn = 262144
  22. ###socket監聽(listen)的backlog上限,在高併發的請求中可能會導致鏈接超時或者觸發重傳###
  23. net.ipv4.tcp_max_orphans = 3276800
  24. ###設定系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上,超過了會print to message###
  25. net.ipv4.tcp_max_syn_backlog = 262144
  26. ###這個參數表示TCP三次握手建立階段接收SYN請求隊列的最大長度,默認是1024,將其設置的大一些可以使出現Nginx繁忙來不及Accept新連接的情況時,Linux不至於丟失客戶端發起的連接請求###
  27. net.ipv4.tcp_timestamps = 0
  28. ###開啓對於TCP時間戳的支持,其時間戳在(請參考RFC 1323)TCP的包頭增加12個字節###
  29. net.ipv4.tcp_synack_retries = 1
  30. ###SYN-ACK握手狀態重試次數,默認爲5,遭受syn-flood攻擊時改爲1或2###
  31. net.ipv4.tcp_syn_retries = 1
  32. ###外向syn握手重試次數,默認爲4###
  33. net.ipv4.tcp_tw_recycle = 1
  34. ###表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉###
  35. net.ipv4.tcp_tw_reuse = 1
  36. ###表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉###
  37. net.ipv4.tcp_mem = 94500000 915000000 927000000
  38. ###三個文本字段,超過第三個的字段TCP會拒絕SOCKET,其單位是內存頁###
  39. net.ipv4.tcp_fin_timeout = 1
  40. ###這個參數表示當服務器主動關閉連接時,socket保持在FIN-WAIT-2狀態的最大時間###
  41. net.ipv4.tcp_keepalive_time = 30
  42. ###當keepalive啓用時,TCP發送keepalive消息的頻度,默認是2小時,若將其設置的小一些,可以更快的清理無效的連接###
  43. net.ipv4.ip_local_port_range = 1024 65000
  44. ###這個參數定義了在UDP和TCP連接中本地(不包括連接的遠端)端口取值範圍###
  45. net.netfilter.nf_conntrack_tcp_timeout_established = 36000
  46. ###established的超時時間###
  47. net.nf_conntrack_max = 655360
  48. ###這個值決定了你作爲網關的工作能力上限,默認65536###
  49. net.ipv4.tcp_syncookies = 0
  50. ###關閉SYN Cookies,默認關閉###

 

調高linux內核打開文件數量

  1. echo ulimit -HSn 102400 >> /etc/profile
  2. echo ulimit -HSn 102400 >> /etc/rc.local
  3. source /etc/profile

 

使用ab壓力測試(頁面爲純php頁面,未讀取數據庫)

開啓緩存後的效果:1W3的ops,cpu負載爲20%

 

php-fpmtesting

php-fpmtesting

 

php-fpmtesting1

php-fpmtesting1

 

關閉緩存後的效果:ops爲:9700,cpu負載爲100%

 

php-fpmtesting2

php-fpmtesting2

 

php-fpmtesting3

php-fpmtesting3

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章