接到一个求助电话,说是有个阿里云上的服务器,有性能瓶颈,但又没有什么具体的数据,只是说偶尔客户端有少数连接不上,或者连接会突然中断。我的天,最怕这种状况了,还得自己去找问题表现是什么,再去找什么原因所致。----懒人可直接点此处,不必辛苦看文字

因为是线上的环境,得分两步进行。先检查,看系统或者应用存在什么明显的印迹,分析原因和处理方法;协商什么时候可以处理,处理风险是什么。

怕影响用户体验,白天还不让搞。月黑风高,家里有没暖气啊(用一块闲置显卡挖矿取暖),没办法,只好熬夜苦战一番。

通过了解,该云主机带宽12M,其他方面的配置,我自己登录看就好。

既然收到带宽,就先看它了,看了好一阵,也不到10M嘛。

其他资源配置为:

(1)cpu 8core

(2)内存 16G

(3)硬盘 50G系统加120G外挂空间。

其中系统负载一直稳定不高,IO也还过得去,系统日志也无明显的报错信息。查看网络状态,TIME_WAIT相对于ESTABLESHED来说,高了不少(因为文章为事后所写,无法再重现了)。根据经验,大致可以判断引起TIME_OUT高的原因主要有两种:一种是系统参数(sysctl.conf)设置,另一种就是应用服务配置。前一种比较好办,乘访问量少的时候,偷偷的修改/etc/sysctl.conf(修改前一定要记得备份哟),然后重载 sysctl -p,再执行netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}',发现TIME_OUT的数量并没有减少多少。由此可知,最大的可能就在系统上边的应用。

当然,作为系统管理员,不可能啥都去问人家,你上边安装了什么,都在啥目录啊,程序之间都什么关联?只要有系统登录权限,哪能难住咱们呢!敲ps auxww |more 加一点点耐心,能查个八九不离十。不就是一个nginx + php + mysql 嘛,挨个检查,应该能查到问题所在。这一回车,好多php进程呢,屏幕翻滚了好几屏。心想,没那么多连接数,跑那么多进程干啥呢?做过过滤,数一下php进程数,好家伙301个。

我有个习惯,喜欢从后边往前边查。于是就从数据库开查,show processlist,没线程连接上来,奇怪了啊。还以为自己眼花,又执行了好几遍,还是这样。检查mysql错误日志,数据目录,毫无所获,难道不是用这个mysql?吃个橘子压压惊,查看网络状态,看它连接到哪里去了。

居然没用本机的mysql(不知道装这个干啥),赶紧电话问,说是购买了阿里云的mysql服务,好吧,看来这个就不用查了。

接下来,该看看nginx了。这一查,还真找到几个不顺眼的地方。按照我的习惯,如果系统上要运行多个web站点,一般都会用明确包含的方式对配置文件进行书写,这样做的好处是,看到主配置文件,就知道有多少站点;而且做维护的时候,如果某些站点要临时变更或者变更后整个web服务启动不了,就可以通过注释掉相关的那行包含(include)语句。最不喜欢谁用什么 include *.conf,你写起来省事,可是后边维护就不那么省事。

没办法,我认了。再进具体包含文件的目录,随机打开一个,截取一段如下:

包含里边嵌套包含,那好,我们就看看它这个包含里边写的啥:

[root@iZm5e64s4c3fznr1kxv1qaZ conf]# more enable-php.conf

location ~ [^/]\.php(/|$)

{

try_files $uri =404;

fastcgi_pass  unix:/tmp/php-cgi.sock;

fastcgi_index index.php;

include fastcgi.conf

又有一个嵌套,狂晕啊!继续看这个fastcgi.conf,就是一个fastsgi_params文件的副本。

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

fastcgi_param  QUERY_STRING       $query_string;

fastcgi_param  REQUEST_METHOD     $request_method;

fastcgi_param  CONTENT_TYPE       $content_type;

fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;

fastcgi_param  REQUEST_URI        $request_uri;

fastcgi_param  DOCUMENT_URI       $document_uri;

fastcgi_param  DOCUMENT_ROOT      $document_root;

fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  REQUEST_SCHEME     $scheme;

fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;

fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;

fastcgi_param  REMOTE_PORT        $remote_port;

fastcgi_param  SERVER_ADDR        $server_addr;

fastcgi_param  SERVER_PORT        $server_port;

fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect

fastcgi_param  REDIRECT_STATUS    200;

各位看官,再往下看这个文件,又来了个fastcgi_pass 127.0.0.1 ,是要用什么方式关联php呢?前边那个include指定的"fastcgi_pass  unix:/tmp/php-cgi.sock;" 后边又跟这么一个是什么用意?

看到没有,这个fastcgi_pass 127.0.0.1 根本没起作用啊,可能是从网上找的,胡乱粘贴一通。另外,也从php那边印证一下,确认服务是否有tcp 9000端口处于监听状态。

[root@iZm5e64s4c3fznr1kxv1qaZ ~]# netstat -anp|grep 9000|wc -l|grep -v grep

0

打开其它站点配置文件,全是这个搞法。得统一做规范,方便自己也是方便他人嘛!不过乱归乱,还是能正常运行,nginx本身也不会对性能产生太大的影响。由这里可以推断,php估计也是胡乱从别的地方复制过来的配置,其内容如下:

[global]

pid = /usr/local/php/var/run/php-fpm.pid

error_log = /usr/local/php/var/log/php-fpm.log

log_level = notice

[www]

listen = /tmp/php-cgi.sock

listen.backlog = -1

listen.allowed_clients = 127.0.0.1

listen.owner = www

listen.group = www

listen.mode = 0666

user = www

group = www

pm = dynamic

pm.max_children = 300

pm.start_servers = 80

pm.min_spare_servers = 80

pm.max_spare_servers = 300

access.log = /mnt/log/phplog/$pool.access.log

access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"

pm.max_requests = 1024

request_terminate_timeout = 0

request_slowlog_timeout = 120

slowlog = /var/log/slow.log

这几个选项值,直接与性能相关。查看php进程数,一直就是设定的数量300(主进程不算)。最大300,而且一直维持不变,新来的请求无法获得新的进程,于是就只好杀掉已经运行的(有可能用户的连接还在),类似于自杀,可以从php的日志里可以看到大量的进程自杀消息。

一般情况下,应该把最大子进程数(pm.max_children = 300)设置得大一些,最大请求数(pm.max_requests)也需要设置大一些。

把这些问题,记录好汇总以后,电话跟其他人沟通,得到答复是等相关人等在线的时候进行修正,万一业务上有问题,可以一起协助处理,但得等两天以后。欲知详细的操作过程,调整后的效果,请猛戳此处即可。

一次网站性能排查实录相关推荐

  1. 一次网站性能排查的经历

    第一次接手JAVA项目,在上线后就遇到了网站性能问题.说实话,对于JAVA我不是很了解,同时有点感冒. 客户内网网站的是用JAVA+TOMCAT6+ORACLE9I开发的.上线后,客户单位有二百多人, ...

  2. 网站性能优化从入门到粗通(PHP 篇)

    本文来自作者 蒋岩 在 GitChat 上分享 「网站性能优化从入门到粗通(PHP 篇)」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 题外话:本次 Chat 的主题是入门到粗通,所以内 ...

  3. 三步法助你快速定位网站性能问题

    本文分享自华为云社区<在瀑布下用火焰烤饼:三步法助你快速定位网站性能问题>,原文作者:Kagol . 引言 性能,是一个问题. 每个项目成长到一定的规模,都几乎必然要遇到性能问题,当遇到性 ...

  4. 网站性能调优实战-学相伴KuangStudy

    面对并发我们是如何优化KuangStudy网站性能的? 每个项目都会随着用户和数据的增长调整架构,来面对未来的问题,我们也不例外,在1月5号我们平台正式公测后,引起了很多观众的热烈反响,仅仅4天,注册 ...

  5. 移动网站性能优化(未完。。。)

    移动网站天生有三种性能限制:带宽低,内存小,处理器性能低. 这些性能挑战又加上其他的问题,如: 网页比以前更大 延迟相差巨大 下载速度相差巨大 解决问题: 改善网站性能的主要策略并没有因为从PC变成手 ...

  6. 网站性能越来越差怎么办?

    新的一年,你的老板或客户,是否曾和你抱怨公司的网站性能愈来愈差?网站大家都会写,自从有了 Visual Studio 之后,连你家楼下的正妹小喵和隔壁的王大婶都会写 ASP.NET.但同样的一个画面, ...

  7. 性能测试回归测试_自动网站性能回归测试

    性能测试回归测试 by Adam Henson 亚当·汉森(Adam Henson) 如何使用Foo自动执行网站性能回归测试 (How to automate website performance ...

  8. 高性能网站性能优化与系统架构(ZT)

    转载请保留出处:俊麟 Michael's blog (http://space.itpub.net/7311285/viewspace-97) 我在CERNET做过拨号接入平台的搭建,而后在Yahoo ...

  9. 炫技,从12.67s到1.06s的网站性能优化实战

    (给视学算法加星标,提升全栈技能) 作者:jerryOnlyZRJ https://juejin.im/post/5b6fa8c86fb9a0099910ac91 0.引言 作为互联网项目,最重要的便 ...

最新文章

  1. 微软熊辰炎:如何利用图神经网络解决半结构化数据问题?
  2. win10 uwp DataContext
  3. java---实现闹钟的基本功能
  4. oracle排序使用,很多中函数,不同的效果
  5. 从零开始数据科学与机器学习算法-学习向量量化(Learning_Vector_Quantization)-08
  6. 超好用!5款开源的移动自动化测试工具
  7. PHP和MySQL Web开发pdf
  8. 图片添加图片水印和文字水印
  9. Haiku OS 的黎明
  10. .net MVC在服务端代码输出html字符串
  11. c# DESEncrypt 加密、解密算法
  12. 软件开发工作者的重心是什么
  13. 离线搭建安卓环境 adt
  14. 微信怎么at所有人_变速箱报废、发动机故障、车门下沉,全新马自达3到底怎么了?...
  15. Linux系统封装及配置
  16. 1分钟了解微信收款商业版
  17. APS高级计划排程系统的基本原理和排程步骤
  18. 苹果自带的清理软件_苹果电脑清理软件哪个好
  19. 中秋节前能跟客户聊的!
  20. Minecraft正版账号获得方法

热门文章

  1. 程序员能力矩阵 Programmer Competency Matrix
  2. iOS 11开发教程(九)iOS11数据线连接真机测试
  3. 在VMware Workstation上安装Kali Linux
  4. pmp matlab 代码,【welch功率谱估计】C语言实现的代码与matlab计算结果不同
  5. python函数定义的要点_python基础之函数重点
  6. 攻破c语言笔试与机试难点,如何攻破C语言学习、笔试与机试的难点.doc
  7. linux配置caffe环境,最全caffe安装踩坑记录(Anaconda,nvidia-docker,linux编译)
  8. 对象转数组_fastJson中java对象 jsonObject jsonArray之间转换
  9. linux定时任务crontab 时间,shell后台定时任务时crontab的用法
  10. 2022年度BCI奖 |THE ANNUAL BCI AWARD