Chinaunix首页 | 论坛 | 博客
  • 博客访问: 669031
  • 博文数量: 53
  • 博客积分: 830
  • 博客等级: 准尉
  • 技术积分: 1089
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-31 18:23
文章存档

2019年(1)

2018年(1)

2016年(1)

2015年(1)

2014年(12)

2013年(4)

2012年(33)

分类: LINUX

2012-05-29 13:25:05

              某项目2

记一次tps提升,做的配置变更:

问题:tps,响应时间高,并发能力差。


1.源码,通过xhprof找出问题代码。产生系统内核调用函数尽量避免调用。比如is_file(), time(),require/include代替require_once/include_once等。


2.尽量使用memcached缓存系统配置、模块数据、还有用户数据。减少mysqli_query()执行次数,它比较耗资源。


3.通过xhprof,我们发现loadrun源文件需要不少的挂钟时间,可以开启apc缓存opcode,同时设置apc.stat=off。还可以使用apcapc_define_constants()代替phpdefine()


4.通过apcmemcached,收效可见,但是tps并没有提升到理想状态,同时tps不稳定,还会触底。php代码本身的优化效果甚微,tps贡献不大。


5.重新编译php,将不必要的模块和功能禁用掉,只编译需要的。


6.配置php.ini,将不必要的模块去掉,比如gd(我们的应用不需要处理图片),soap,xhprof,mssql等。通过pmap或者lsof可以查看一个php-cgi加载了哪些模块。减少模块加载,可以节约内存。尽量通过php.ini进行php设置,避免在代码中调用init_set操作。比如设置时区,设置session等等。尤其data.timezone需要配置。


7.通过禁用xhprof,大概可以省下5000csxhprof用完了,就应该关闭。


8.正确地设置php-fpm.max_children数量。过多的max_children浪资内存资源,还会增加cs。当然,过少的max_children会响应502。可以通过top命令观察,调整该值。


9.php-fpm使用sock方式配置。php-fpm.listen_address=/var/run/php-cgi.sock,同时nginx也需要配置fastcgi_pass指向该sock文件。


10.设置nginx.worker_processes,分别尝试了248几个值。网上大量资料说设置不cpu*核数,其实更需要根据你的需求来设定这个值。worker值越大,表示同时处理量大但速度更慢,相反表示处理速度能力强但数量更小。如果做为反向代理服务器,worker值可以大一点,如果做为web逻辑服务器,值可以小一点。


11.网络IO,选择支持多路复用模型epollFreeBSD采用kqueue。如果网站流量小,选择select也还是不错的。


12.开启持久连接功能keep-alivekeep-alive可以复用tcp/ip连接,大量地减少了accept()系统内容调用。这里将nginx.keepalive_timeout设置为60.注意http/1.1默认开启keep-alive


13.gzip,压缩http响应输出。当响应输出量足够小,使用gzip压缩并没有意义。可以通过gzip_min_length指定跳过gzip压缩。


14.关闭nginx.access_log。通过access_log off可以不记录日志。减少不必要的磁盘I/O操作。如果开启日志功能,最好写个脚本将日志按量分割成更小的文件。


15.对于静态资源服务器,可以开启sendfile功能和设置expires缓存新鲜期。


16.selinux设置为disabled,命令setenforce 0,只是将selinux设置为permissive,该模式会执行安全策略检查并打印警告。


17.通过chkconfig管理系统随机开启的守护进程。将不必要启动的守护进程关闭,比如sendmail, portmap, atd, netfs, nfslock等。这些守护进程浪费内存空间。


18.关闭防火墙,iptables --flush可以清除所有防火墙规则。


19.将不必要的进程关闭。比如/sbin/mingetty只需要开启3个就足够用,可以在/etc/inittab配置。比如gdm进程,通过/etc/inittabid:5:initdefault:改为id:3:initdefault:。等等。通过ps -ef可以查看你当前打开的进程,请确定每一个进程都"出师有名"


20.资源限制,每个进程可以打开的文件最大数量默认是1024,通过ulimit设置更大的值(ulimit -SHn 65535)。如果没有生效,可以编辑资源限制配置文件/etc/security/limits.conf。同时别忘记了将php-fpm.rlimit_filesnginxworker_rlimit_nofileworker_connections设置同样大小。


21.优化磁盘IO,增加持载参数noatime。可以编辑/etc/fstab,注意不要在/etc/fstab增加挂载参数data=writeback,会导致磁盘挂载为ro

22.关闭ipv6内核模块


23.增加dns查询记录至/etc/hosts。比如222.73.211.215 epwb01.jt-tech.net


24.调整内核参数。经过一番折腾,tps有提升,但是不稳定,通过sysctl调整内核参数则稳定了。

net.ipv4.tcp_max_syn_backlog = 65536

net.core.netdev_max_backlog =  32768

net.core.somaxconn = 32768

 

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

 

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

 

net.ipv4.tcp_tw_recycle = 1

#net.ipv4.tcp_tw_len = 1

net.ipv4.tcp_tw_reuse = 1

 

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_max_orphans = 3276800

 

#net.ipv4.tcp_fin_timeout = 30

#net.ipv4.tcp_keepalive_time = 120

net.ipv4.ip_local_port_range = 1024  65535


结果:

通过一番辛苦,tps终于从120升到了810,并且tps曲线平衡(几乎时条直线),cpu资源的利用率也很平衡80%us20%sys。要提高tps,首先要保证单个请求响应时间不能过长,响应时间过大,tps较难提升。更少的上下文切换和更少的系统内核调用,更少的IO操作可以换得更大的tps。通过strace可以统计出调用了哪些系统内核调用,帮助你优化应用。减少上下文切换最有效的办法就是减少进程数量。

测试通过!


阅读(1510) | 评论(0) | 转发(0) |
0

上一篇:某项目1

下一篇:某项目3

给主人留下些什么吧!~~