1.應用自己,經過xhprof找出問題代碼。產生系統內核調用函數儘可能避免調用。好比is_file(), time(),require/include代替require_once/include_once等。
2.儘可能使用memcached緩存系統配置、模塊數據、還有用戶數據。減小mysqli_query()執行次數,它比較耗資源。開啓mysqld的slow_query日誌功能,優化那些較慢的sql查詢語句。
2.經過xhprof,咱們發現load和run源文件須要很多的掛鐘時間,能夠開啓apc緩存opcode,同時設置apc.stat=off。還可使用apc的apc_define_constants()代替php的define()
3.經過apc和memcached,收效可見,可是tps並無提高到理想狀態,同時tps不穩定,還會觸底。php代碼自己的優化效果甚微,對tps貢獻不大。
4.從新編譯php,將沒必要要的模塊和功能禁用掉,只編譯須要的。
5.配置php.ini,將沒必要要的模塊去掉,好比gd(咱們的應用不須要處理圖片),soap,xhprof,mssql等。經過pmap或者lsof 能夠查看一個php-cgi加載了哪些模塊。減小模塊加載,能夠節約內存。儘可能經過php.ini進行php設置,避免在代碼中調用init_set操 做。好比設置時區,設置session等等。尤爲data.timezone須要配置。
6.經過禁用xhprof,大概能夠省下5000個cs。xhprof用完了,就應該關閉。
7.正確地設置php-fpm.max_children數量。過多的max_children浪資內存資源,還會增長cs。固然,過少的max_children會響應502。能夠經過top命令觀察,調整該值。
8.php-fpm使用sock方式配置。php-fpm.listen_address=/var/run/php-cgi.sock,同時nginx也須要配置fastcgi_pass指向該sock文件。
9.設置nginx.worker_processes,分別嘗試了二、四、8幾個值。網上大量資料說設置爲cpu數*核數,其實更須要根據你的需求來設 定這個值。worker值越大,表示同時處理量大但速度更慢,相反表示處理速度能力強但數量更小。若是作爲反向代理服務器,worker值能夠大一點,如 果作爲web邏輯服務器,值能夠小一點。
10.網絡IO,選擇支持多路複用模型epoll,FreeBSD採用kqueue。若是網站流量小,選擇select也仍是不錯的。
11.開啓持久鏈接機制keep-alive,keep-alive能夠複用tcp/ip鏈接,大量地減小了accept()系統內核調用。這裏將nginx.keepalive_timeout設置爲60.注意http/1.1默認開啓keep-alive
12.gzip,壓縮http響應輸出。當響應輸出量足夠小,使用gzip壓縮並無意義。能夠經過gzip_min_length指定跳過gzip壓縮。
13.關閉nginx.access_log。經過access_log off能夠不記錄日誌。減小沒必要要的磁盤I/O操做。若是開啓日誌功能,最好寫個腳本將日誌按量分割成更小的文件。
14.對於靜態資源服務器,能夠開啓sendfile功能和設置expires緩存新鮮期。
15.將selinux設置爲disabled,命令setenforce 0,只是將selinux設置爲permissive,該模式會執行安全策略檢查並打印警告。
16.經過chkconfig管理系統隨機開啓的守護進程。將沒必要要啓動的守護進程關閉,好比sendmail, portmap, atd, netfs, nfslock等。這些守護進程浪費內存空間。
17.關閉防火牆,iptables –flush能夠清除全部防火牆規則。
18.將沒必要要的進程關閉。好比/sbin/mingetty只須要開啓3個就足夠用,能夠在/etc/inittab配置。好比gdm進程,經過 /etc/inittab將id:5:initdefault:改成id:3:initdefault:。等等。經過ps -ef能夠查看你當前打開的進程,請肯定每個進程都」出師有名」。
19.資源限制,每一個進程能夠打開的文件最大數量默認是1024,經過ulimit設置更大的值(ulimit -SHn 65535)。若是沒有生效,能夠編輯資源限制配置文件/etc/security/limits.conf。同時別忘記了將php- fpm.rlimit_files和nginx的worker_rlimit_nofile、worker_connections設置一樣大小。
20.優化磁盤IO,添加掛載參數noatime。能夠編輯/etc/fstab,注意不要在/etc/fstab增長掛載參數data=writeback,會致使磁盤掛載爲ro。
21.關閉ipv6內核模塊
22.增長dns查詢記錄至/etc/hosts。好比222.73.211.215 www.perfgeeks.com
23.調整內核參數。通過一番折騰,tps有提高,可是不穩定,經過sysctl調整內核參數則穩定了。
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768php
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216mysql
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2linux
net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1nginx
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800web
#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535sql
經過一番辛苦,tps終於從120升到了810,而且tps曲線平衡(幾乎時條直線),cpu資源的利用率也很平衡80%的us和20%的sys。 要提升tps,首先要保證單個請求響應時間不能過長。響應時間過大,tps較難提高。更少的上下文切換和更少的系統內核調用,更少的IO操做能夠換得更大 的tps。經過strace能夠統計出調用了哪些系統內核調用,幫助你優化應用。減小上下文切換最有效的辦法就是減小進程數量。緩存