当前位置: 首页 > Linux

Nginx+PHP-FPM优化技巧总结

时间:2023-04-06 23:22:39 Linux

Nginx+PHP-FPM优化技巧总结这里是网上找的一篇文章,仔细实践了一下,有很多参考可以学习,因为之前文章的布局是很混乱,所以我在学习的同时重写和整理了这篇文章。所有版权归原作者所有。UnixDomainSocket通信之前简单介绍过UnixDomainSocket的通信方式,参见:Nginx+PHP-FPM的DomainSocket配置方式不通过网络确实可以提高Nginx和php-fpm通信的性能,但是会高并发时不稳定。Nginx会频繁报错:connect()tounix:/dev/shm/php-fcgi.sockfailed(11:Resourcetemporaryunavailable)而连接上游可以通过以下两种方式提高稳定性:1.增加nginx和php-fpm中的backlog配置方法是:在nginx配置文件中本域名的服务器下,listen80后添加defaultbacklog=1024,同时在php-fpm.conf中配置listen.backlog为1024,默认为128。2.增加sock文件和php-fpm实例的个数并新建一个sock文件,使用Nginx中的upstream模块将请求负载均衡到两个socks后面的两组php-fpm实例上文件。php-fpm参数调优2.1进程数#php-fpm初始/空闲/最大工作进程数pm.max_children=300pm.start_servers=20pm.min_spare_servers=5pm.max_spare_servers=352.2maximumnumberofprocessingrequestsmaximumnumberofprocessingrequests是指一个php-fpmworker进程在处理了多少请求后会终止,而master进程会重新生成一个新的。这个配置主要是为了避免php解释器或者程序引用第三方库造成的内存泄露pm.max_requests=102402.3最大执行时间最大执行时间可以在php.ini和php-fpm.conf中配置,配置项分别是max_execution_time和request_terminate_timeout。其作用及影响见:Nginx中502和504错误详解php-fpmCPU占用率高排查方法一、CPU占用率监控方法top命令:直接执行top命令后,输入1可以看到各核心CPU占用情况速度。并且top-d0.1可以缩短采样时间。下面的sar好像是最短的1秒sar命令:#Installationofsarandiostatcommands:sysstat.x86_64:Thesarandiostatsystemmonitoringcommandsyuminstall-ysysstat.x86_64#Executesar-PALL1100.-PALL表示监控所有核心,1表示每1秒采集一次,100表示??采集100次。#输出结果如下:CPU%用户%NICE%系统%IOWAIT%窃取%IDLEALL85.540.005.690.000.000.008.76074.750.000.000.000.000.000.000.000.000.000.000.000.0000.0028920.0016.00594.950.005.050.000.000.00695.000.004.004.000.000.000.00787.880.004.040.000.000.000.008.08893.940.003.030.003.030.000.003.03988.001273.270.007.920.000.0018.811381.440.004.120.000.0014.431477.230.006.930.000.0015.841578.790.004.040.000.0017.172.开启慢日志配置输出php-fpm慢日志,阀值为2秒:request_slowlog_timeout=2slowlog=log/$pool.log.slowusesthesort/uniqcommandtoanalyzeandsummarizephp-fpmslowlogs:[root@boolelog]grep-v"^$"www.log.slow.tmp|cut-d""-f3,2|sort|uniq-c|sort-k1,1nr|head-n505181run()/www/test.net/framework/web/filters/CFilter.php:415156filter()/www/test.net/framework/web/filters/CFilterChain.php:1312670=/www/test.net/index.php2636run()/www/test.net/application/controllers/survey/index.php:6652630action()/www/test.net/application/controllers/survey/index.php:182625run()/www/test.net/framework/web/actions/CAction.php:752605runWithParams()/www/test.net/framework/web/CController.php:3092604runAction()/www/test.net/framework/web/filters/CFilterChain.php:1342538run()/www/test.net/framework/web/CController.php:2922484runActionWithFilters()/www/test.net/framework/web/CController.php:2662251run()/www/test.net/framework/web/CWebApplication.php:2761799翻译()/www/test.net/application/libraries/Limesurvey_lang.php:1181786load_tables()/www/test.net/application/third_party/php-gettext/gettext.php:2541447runController()/www/test.net/framework/web/CWebApplication.php:135#参数说明:sort:对单词进行排序uniq-c:显示唯一的行,并在每行排序的开头加上该行在文件中出现的次数-k1,1nr:按照第一个字段和值排序,倒序head-10:取前10行数据3.使用strace跟踪进程1.使用nohup将strace转为后台执行,直到php-ontheattach直到fpm进程死掉:nohupstrace-T-p13167>13167-strace.log&#参数说明:-c统计每次系统调用的执行时间、次数和错误等-d输出straceabout标准的错误调试信息。-f跟踪由fork调用生成的子进程。-ofilename,则所有进程的trace结果都输出到对应的filename-F尝试tracevfork调用。当-f时,vfork不被跟踪。-h打印一条简短的帮助信息。-i打印系统调用的入口点。-q禁止输出有关分离的消息。-r打印每个系统调用的相对时间。-t在输出的每一行前加上时间信息。-tt在输出的每一行之前添加时间信息,以微秒为单位。-ttt以微秒为单位输出,以秒为单位表示时间。-T显示每次调用所花费的时间。-v输出所有系统调用。一些关于环境变量、状态、输入输出等调用由于使用频繁,默认不输出。-V输出strace版本信息。-x以十六进制形式输出非标准字符串-xx所有字符串均以十六进制格式输出。-a列设置返回值的输出位置。默认是40。-eexecve只记录execve-p主进程号2等系统调用。也可以使用-c参数让strace帮助总结,很方便也很强大![root@b28-12log]#strace-cp9907Process9907attached-interrupttoquitProcess9907detached%timesecondsusecs/callcallserrorssyscall-----------------------------------------------------------56.610.01661253121read11.110.00325912517715stat8.040.0023587349brk6.020.00176711315poll4.280.0012556228recvfrom2.710.0007961671open2.540.00074502453fcntl2.370.00069611141write1.690.000497159313access1.370.00040301816lseek0.890.000262145122sendto0.560.0001631276208lstat0.490.0001450384getcwd0.310.00009001222fstat0.280.0000820173munmap0.260.0000770174mmap0.240.000069241socket0.230.0000680725close0.000.000000013rt_sigaction0.000.000000013rt_sigprocmask0.000.00000001rt_sigreturn0.000.000000078setitimer0.000.00000002626connect0.000.0000000152accept0.000.000000039recvmsg0.000.000000026shutdown0.000.000000013绑定0.000.000000013GetsockName0.000.000000065Setsockopt0.000.000000013Getsockopt0.000.00000008getlands0.000.0000000.0000000.0000000.000000-------0---Futex----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------100.000.02934418000986total4加速PHP解释和execution如果自己的程序没有问题,但是执行的操作太多,无法优化,可以考虑使用APC或xcache等PHP加速器,减少CPU解释php文件的耗时。这些PHP加速器会在php文件第一次被解释时生成中间代码操作码,所以后续的执行速度会快很多,减少一些CPU操作。下面以xcache为例,看看如何安装和配置。安装xcache的命令如下。./configure里面的参数太多,不知道是干什么用的,官网上也没有说明,所以只启用--enable-xcache:tarzxvfxcache-3.0.3.tar。gz/usr/local/php/bin/phpize./configure--with-php-config=/usr/local/php/bin/php-config--enable-xcachemakemakeinstallphp.ini配置如下,最重要的是红色的两个参数,一般根据php文件个数推荐xcache.size,xcache.count与CPU核数相同:[xcache.admin]xcache.admin.enable_auth=Offxcache。admin.user="xcache"xcache.admin.pass=""[xcache]xcache.shm_scheme="mmap"xcache.size=1024Mxcache.count=16xcache.slots=8Kxcache.ttl=0xcache.gc_interval=0xcache.var_size=16Mxcache.var_count=1xcache.var_slots=8Kxcache.var_ttl=0xcache.var_maxttl=0xcache.var_gc_interval=300xcache.test=Offxcache.readonly_protection=Off;xcache.readonly_protection=Onxcache.mmap_path="/dev/zero";xcache.mmap_path="/tmp/xcache"xcache.coredump_directory=""xcache.cacher=Onxcache.stat=Onxcache.optimizer=Off[xcache.coverager];;xcache.coverager=On;;xcache.coveragedump_directory=""常见问题是启动php-fpm时会报错:Cann不能打开或创建由xcache.mmap_path设置的文件,检查路径权限或检查xcache.size/var_size是否符合系统限制这是因为/tmp/xcache是文件,不能创建为目录。重启php-fpm服务后,使用top命令观察会发现每个worker进程的VIRT(包括swap区)都是xcache.size,但是REQ变得很小。使用上面的配置可以缩短CPU使用的高峰时间,但是在高峰的时候,所有的核心还是会达到90%以上。不知道是不是配置有问题。另外,在并发较高的时候,/dev/zero的配置方式经常会导致Nginx502错误。/tmp/xcache和readonly_protection非常稳定。PHP程序性能监控常用的方法是开启xdebug的性能监控功能,通过WinCacheGrind软件分析xdebug的输出结果。xdebug的安装和用IDE调试的方法可以参考:Vim+XDebug调试PHPphp.ini配置这几项输出性能信息:xdebug.auto_trace=onxdebug.auto_profile=onxdebug.collect_params=onxdebug.collect_return=onxdebug.profiler_enable=onxdebug.trace_output_dir="/tmp"xdebug.profiler_output_dir="/tmp"这样XDebug会输出所有执行的php函数的性能数据,但是生成的文件会比较大。可以关闭一些选项,例如collect_params和collect_return以减少输出数据量。或者关闭自动输出,在要监控的函数首尾分别调用xdebug函数监控指定函数。输出文件名类似于cachegrind.out.1277560600和trace.3495983249.txt,可以在Windows平台上用WinCacheGrind进行图形分析。关于WinCacheGrind的使用方法网上有很多介绍,这里不再赘述。WinCacheGrindforgithub总结以上是最近PHP程序优化工作总结出来的一些优化方法。各个地方的配置请详细阅读官方文档进行修改。它不必基于本文。本文档仅说明方法。警告:本文版权归博客园有毒所有。只是学着在之前的文章上动手做实验,用segmentfault强大的markdown编辑器对好的文章重新排版。这才是分享文章让更多开发者学习受益的真正意义!参考资料:Nging+PHP-FPM优化总结