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能够统计出调用了哪些系统内核调用,帮助你优化应用。减小上下文切换最有效的办法就是减小进程数量。缓存