“Php性能优化”的版本间的差异
跳到导航
跳到搜索
第168行: | 第168行: | ||
[https://www.cnblogs.com/sgm4231/p/10189744.html OPcache及php语法检查] | [https://www.cnblogs.com/sgm4231/p/10189744.html OPcache及php语法检查] | ||
+ | |||
+ | https://support.acquia.com/hc/en-us/articles/360005319294-Understanding-and-Resolving-PHP-OPcache-and-OPcache-Interned-Strings-buffer-errors | ||
=php-fpm.conf= | =php-fpm.conf= |
2020年4月1日 (三) 05:58的版本
目录
pre check
看当前php-fpm进程的内存占用情况及启动时间,命令如下: ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'|grep www|sort -nrk5 从下图可以看出当前php-fpm所有进程平均每个进程占用了60-70MB的内存,启动时间
少安装不要的PHP模块
kernel
这个kernel 独立出来吧 #dkm/dkmops/osinit/init.sh #dkm/init/init.sh fs.file-max = 6553500 net.ipv4.conf.eth0.accept_source_route = 0 net.ipv4.conf.eth1.accept_source_route = 0 net.ipv4.conf.lo.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.tcp_syncookies = 1 net.ipv4.conf.eth0.secure_redirects = 1 net.ipv4.conf.eth1.secure_redirects = 1 net.ipv4.conf.lo.secure_redirects = 1 net.ipv4.conf.default.secure_redirects = 1 net.ipv4.conf.all.secure_redirects = 1 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.eth1.accept_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.eth1.send_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1800 net.core.wmem_max = 8388608 net.core.rmem_max = 8388608 net.ipv4.tcp_rmem = "4096 873814 8738140" net.ipv4.tcp_wmem = "4096 873814 8738140" net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_synack_retries = 1 [[ ! -f /etc/security/limits.d/nofile.conf ]] && echo "* - nofile 8192" >> /etc/security/limits.d/nofile.conf 2.调高linux内核打开文件数量,可以使用这些命令(必须是root帐号)(我是修改/etc/rc.local,加入ulimit -SHn 51200的) echo `ulimit -HSn 65536` >> /etc/profile echo `ulimit -HSn 65536` >> /etc/rc.local source /etc/profile 如果`ulimit -n`数量依旧不多(即上面配置没生效)的话, 可以在 /etc/security/limits.conf 文件最后加上 * soft nofile 51200 * hard nofile 51200
体结构方面优化PHP性能 1.将PHP升级到最新版 提高性能的最简单的方式是不断升级、更新PHP版本。 2.使用分析器 网站运行缓慢的原因颇多,Web应用程序极其复杂,让人扑朔迷离。而一种可能性在于PHP代码本身。这个分析器可以帮助你快速找出造成瓶颈的代码,提高网站运行的总体性能。 Xdebug PHP extension提供了强大的功能,可以用来调试,也可以用来分析代码。方便开发人员直接跟踪脚本的执行,实时查看综合数据。还可以将这个数据导入到可视化的工具 KCachegrind中 5.PHP缓存,使用PHP加速器:APC 如下的 开启Opcache 一般情况下,PHP脚本被PHP引擎编译后执行,会被转换成机器语言,也称为操作码。如果PHP脚本经过反复编译而得到相同的结果,那为什么不完全跳过编译过程呢? 通过PHP加速器,你完全可以实现这一点,它缓存了PHP脚本编译后的机器码,允许代码根据要求立即执行,而不经过繁琐的编译过程 6.内存缓存 PHP通常在检索和数据分析方面扮演着重要角色,这些操作可能会导致性能降低。实际上有些操作是完全没有必要的,特别是从数据库中反复检索一些常用的静态数据。不妨考虑一下短期使用 Memcached extension来缓存数据。Memcached的扩展缓存与libMemcached库协同工作,在RAM中缓存数据,也允许用户定义缓存的期限,有助于确保用户信息的实时更新。 7.内容压缩: 几乎所有的浏览器都支持Gzip的压缩方式,gzip可以降低80%的输出,付出的代价是大概增加了10%的cpu计算量。但是赚到的是不仅占用的带宽减少了,而且你的页面加载会变得很快,优化了你的PHP站点性能。 你可以在PHP.ini中开启它 zlib.output_compression = On zlib.output_compression_level = (level)(level可能是1-9之间的数字,你可以设置不同的数字使得他适合你的站点。) 如果你使用apache,你也可以激活mod_gzip模块,他是高度可定制的。 8.服务器缓存: 主要是基于web反向代理的静态服务器nginx和squid,还有apache2的mod_proxy和mod_cache模块 9.数据库优化:数据库缓存等 通过配置数据库缓存,如开启QueryCache缓存,当查询接收到一个和之前同样的查询, 服务器将会从查询缓存种检索结果,而不是再次分析和执行上次的查询 以及数据存储过程,连接池技术等。
[PHP] - 性能加速 - 开启Opcache
PHP 5.5 以后内建了 OpCache , OpCache 的加速原理是把编译后的 bytecode 存储在内存里面,避免重复编译 PHP 所造成的资源浪费. 打开php.ini文件 2. 找到:[opcache],设置为: 添加opcache.so 在php.ini最后一行添加opcache.so 主要作用是用来引用opcache [opcache] ; so地址 zend_extension=opcache.so ; 开关打开 opcache.enable=1 ; 开启CLI opcache.enable_cli=1 ; 设置共享内存大小, 单位为:Mb ; 可用内存, 酌情而定, 单位为:Mb opcache.memory_consumption=128 ;如果启用,那么 OPcache 会每隔 opcache.revalidate_freq 设定的秒数 检查脚本是否更新。 如果禁用此选项,你必须使用 opcache_reset() 或者 opcache_invalidate() 函数来手动重置 OPcache,也可以 通过重启 Web 服务器来使文件系统更改生效。 opcache.validate_timestamps=60 #提示:在opcache使用软连接的情况下,会存在opcache没有被清除的情况.可以使用重启fastcgi来解决这个问题. ; Zend Optimizer + 暂存池中字符串的占内存总量.(单位:MB) opcache.interned_strings_buffer=8 ; 对多缓存文件限制, 命中率不到 100% 的话, 可以试着提高这个值 opcache.max_accelerated_files=10000 ; Opcache 会在一定时间内去检查文件的修改时间, 这里设置检查的时间周期, 默认为 2, 定位为秒 opcache.revalidate_freq=1 ; 打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高 opcache.fast_shutdown=1 [root@abcdocker ~]# tail /etc/php.ini zend_extension="opcache.so"
php-fpm.conf
PHP-CGI-->php-fpm
max_children
pm = static/dynamic,标识fpm子进程的产生模式 static(静态) :表示在fpm运行时直接fork出pm.max_chindren个worker进程 dynamic(动态):表示运行时fork出start_servers个进程,随着负载的情况,动态的调整,最多不超过max_children个进程。这个在自己的VPS 生产一般推荐用static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源。 max_children这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。 设置”max_children”也需要根据服务器的性能进行设定 一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右 假设“max_children”设置成100个,20M*100=2000M 也就是说在峰值的时候所有PHP-CGI所耗内存在2000M以内。 如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误 pm.start_servers的默认值为2。并且php-fpm中给的计算方式也为:{(cpu空闲时等待连接的php的最小子进程数) + (cpu空闲时等待连接的php的最大子进程数 - cpu空闲时等待连接的php的最小子进程数)/ 2}; 用配置表示就是:min_spare_servers + (max_spare_servers - min_spare_servers) / 2;一般而言,设置成10-20之间的数据足够满足需求了
最大请求数max_requests
我一般是500 最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。 这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露 502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的.但是为什么要重启进程呢?如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长(比如第三方库有问题等)。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。正是因为这个机制,在高并发中,经常导致 502 错误目前我们解决方案是把这个值尽量设置大些,减少 PHP-CGI 重新 SPAWN 的次数,同时也能提高总体性能。PS:刚开始我们是500导致内存飙高,现在改成5120,当然可以再大一些,10240等,这个主要看测试结果,如果没有内存泄漏等问题,可以再大一些
最长执行时间request_terminate_timeout
max_execution_time和request_terminate_timeout; The timeout for serving a single request after which the worker process will; be killed. This option should be used when the ‘max_execution_time’ ini option; does not stop script execution for some reason. A value of ‘0’ means ‘off’.; Available units: s(econds)(default), m(inutes), h(ours), or d(ays); Default Value: 0;request_terminate_timeout = 0============设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ‘0’ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。这两项都是用来配置一个PHP脚本的最大执行时间的。当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误
request_slowlog_timeout = 10
PHP-FPM设置max_chindren、max_requests
慢查询
我们有时候会经常饱受500,502问题困扰。当nginx收到如上错误码时,可以确定后端php-fpm解析php出了某种问题,比如,执行错误,执行超时。 这个时候,我们是可以开启慢日志功能的。 slowlog = /var/log/php-fpm.log.slow request_slowlog_timeout = 15s 当一个请求该设置的超时时间15秒后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。 php-fpm慢日志会记录下进程号,脚本名称,具体哪个文件哪行代码的哪个函数执行时间过长: [21-Nov-2013 14:30:38] [pool www] pid 11877 script_filename = /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php [0xb70fb88c] file_get_contents() /usr/local/lnmp/nginx/html/www.quancha.cn/www/fyzb.php:2 通过日志,我们就可以知道第2行的file_get_contents 函数有点问题,这样我们就能追踪问题了
一般来说
对于大内存以及对并发和可用性要求的话,建议使用static管理模式+最大的pm.max_children
问题哦php-fpm.conf max_children 和 max_requests怎么配置
一天有20万PV,服务器是R420 双CPU 内存是16G怎么配置参数呀?php-fpm.conf max_children 和 max_requests怎么配置 还有nginx.conf中的最大连接数最佳配置是多少 答: max_children是PHP-FPM Pool 最大的子进程数,他数值取决于你的服务器内存。 假设你打算给10G内存给当前配置的PHP-FPM Pool,一般一个PHP请求占用内存10M-40M,我们按站点每个PHP请求占用内存25M,这样max_children = 10G/25M = 409。所以,这个值可以根据情况算出来 max_requests是每个子进程重生之前处理的请求数, 默认值为unlimited(默认为1024),可以设置小一点(如500左右),这样可以避免内存泄露带来的问题 Nginx代理过程,将业务服务器请求数据缓存到本地文件,再将文件数据转发给请求客户端。高并发的客户端请求,必然要求服务器文件句柄的并发打开限制。使用ulimit命令(ulimit -n),查看Linux系统文件句柄并发限制,默认是1024,我们可以改为65535(2 的 16 次方,这是系统端口的极限)。修改的方法为:修改系统文件/etc/security/limits.conf,添加如下信息,并重新启动系统生效。 * soft nofile 65535 * hard nofile 65535 然后在Nginx配置文件中,把文件限制及连接数信息改为65535: worker_rlimit_nofile 65535; events { use epoll; worker_connections 65535; }
php.ini
see also
Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题
php.net/manual/zh/install.fpm.configuration.php
PHP的pm、pm.max_requests、memory_limit参数优化说明