如何排查系统问题和瓶颈? | 马犇-技术博客

如何排查系统问题和瓶颈?

来源:本站原创 微信技术群总结 超过2,622 views围观 0条评论
1. 计划任务php进程没跑完就停了,会可能是哪些原因?求助. 没有错误和异常. 没错误日志. 整个流程有try catch. 有写大量日志. 可复现 – 泉-June
回: 你用一下shutdown dunction那个函数看看发生了什么呢 – 花生
回: php 有时会因为扩展而终止,有时没有异常日志,但可用xdebug trace 能找出最后的执行语句。你可试试. get post 加XDEBUG_TRACE 条件出发 – hilojack
回: 在各位帮助下找到原因,写日志太多,未写入前积累爆内存 – 泉-June
2. 如果是c或c++的程序,进程异常退出会产生core文件,php以及扩展是c写的,可以用gdb来看看core在哪了 – 水浸街
3. 问: 之前有遇到过生成好多.core文件到硬盘上 还好服务器硬盘还够 大家有碰到过吗 – 汉族教父
回: 可以设置的,包括大小限制和路径、是否覆盖,上百度一搜就有. 不要扩展名就只有一个core文件,就不存在占用空间问题了,我们的生产系统都是这样. /proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。 – 水浸街
回: 是不是把这个参数设成0就会一直写到一个不带pid的文件了 否则会每次生成一个带pid的core导致磁盘爆满 – 汉族教父
回: 是的,不过core很频繁应该想办法解决,肯定是程序设计的问题 – 水浸街
4. 我们有一部分后端是用c++写的,回到今天的话题,解决问题用得最多的是gdb,然后是pstack、pmap、nm、ldd、top这些来定位问题,不知道用在php写的系统是否可以,前端用得最多的是httpwatch – 水浸街
5. 问: 麻烦解释下什么core – @理鱼
回: core文件是系统生成的. 一般是段错误引起的,就是常说的内存操作错误. core文件的生成过程叫做coredump. core文件一般是运行时整个进程操作的各种资源内存景象信息,还包括代码。为了保证core文件可读,gdb编译的时候不要使用太高的优化,就是-o参数,否则你会啥的看不了的. 记得貌似要打开-g参数。才能看到源码,细节搜索下. php生成的core文件默认在webroot目录 – 黑夜路人
回: 打开-g也得有源码的情况下才能看到吧,没有源码顶多查看堆栈的时候看到个函数名,甚至函数名也看不到 – 马犇
回: php 不清楚,c.c+ 需要可执行文件或者类库,
具体搜索下: gdb coredump – 林浩杰
回: 用gdb编译的时候开启这个选项 – 黑夜路人
回: 不需要源代码 编译加上-g – 林浩杰
回: 你编译当然有源码了,汗 – 黑夜路人
回: 如果你调试其他没有源代码 编译不给你加 这个东西 你也无能为力了 – 林浩杰
回: -g会附带符号信息 用于调试 – 朝沐金风
6. php编译的时候貌似需要加上–debug选项. 然后出coredump的时候才有文件. 另外一个是要打开linux内核设置的core file选项. 一般很简单,用ulimit为无限就行了. 然后,写个脚本监控一下webroot. 目录下有木有core文件就行了 – 黑夜路人
7. 一般做过linux下面c开发,这些套路都懂,恩。所以建议做做基本的c开发. ps:golang编译的二进制可以直接用gdb来调试哟 – 黑夜路人
8. 一般追查,当然二话不说看日志了. 先看现象,比如是打开页面慢,还是直接打不开,或者接口不能用. 一般先判断物理是否故障. 比如用ping啊,查看nslookup域名解析啊. 如果完全ping不通,或者国内ping的网络耗时很高,说明要么你本地网络有问题,要么服务器网络有问题。一般网络,无非机房故障,或者服务器网卡被打满,或者被DDOS攻击了。也可能域名被劫持。 – 黑夜路人
9. 如果物理没问题,就开始看系统。一般追查从接入层,比如CDN,或者vanish,或者lvs,haproxy,或者nginx开始. 有的可能是lvs挂了,无法顺利分发请求,那你就跳过lvs,自己直接设定一个服务器的ip来测试。有些可能cdn或者vanish挂了,测试看看。 – 黑夜路人
10. 如果接入层没问题,就开始检查应用层. 一般就是web服务器啊,php之类的. 比如你用的是nginx,发现500之类的,可能就是nginx有可能有问题。比如报502之类的,那么不出意外,就是你php-fpm有问题. 如果只是响应很难,那可能是php有问题,因为nginx一般出问题比较少. – 黑夜路人
11. 一般看看nginx的错误日志,比如说502 日志里是upstream time out,就是php响应太慢无疑了。因为一般fastcgi会有超时设置,包括连接超时,读超时,写入超时等,所以看到这条日志,就去看你的php是啥情况吧。一般php-fpm可以,简单看看起来了几个进程。有没有僵尸进程。php追查最主要依赖日志,包括php错误日志,还有php fpm slow log等。 – 黑夜路人
12. 错误日志里一般能够看到比如了解memcache或者mysql连接错误等等。比如看到mysql错误,什么too many connection之类,就是mysql连接太多挂了. 实际情况会比较复杂,因为业务不会只是访问一个后端,可能各种后端,有时候,基本的php error log大部分信息没收集到。所以,这个时候,一般推荐php代码要多打印日志。特别后端连接和各种读写操作的日志,特别时间耗费日志。 – 黑夜路人
13. 我想判断用户端故障,这个我搞的太多了远程不下于200个用户的电脑. 我比较二了。 说说我的过程。
故障现象, 移动用户无法访问
  1、 ping检查,nslookup检查, 检查域名解析的ping是否为自己的节点ip,是否解析为对应的调度ip 如果解析的不对,检查用户dns配置。
  2、ping检查,nslookup检查通过, 不管是能ping 还是 无法ping 的情况。
使用telnet 检查端口 telnet 8.8.8.8 80 检查是否通。 如果80也不通,试试换一个你自己的开了其他端口的ip 比如 4.4.4.4 22 看看是否能telnet – @理鱼
14. 移动线路跨isp访问电信老出问题。 用户重启路由器后,换一移动ip就可以访问了。 后来实在是烦,部署了bgp节点后解决移动的问题。
移动还有个其他问题。 – @理鱼
15. 故障现象。 用户访问不了网站。 打开页面提示 一些其他http 错误。 比如 403 404等 。 远程用户后发现这个现象太奇怪了。 解析都ok。 telnet 80 也通。 然后我检查http header头发现了猫腻。 发现移动使用了强制http正向代理缓存。 原来是尼玛,南通移动用了蓝汛的强制http正向代理缓存出了问题。 这个问题当时没法处理,后来自己恢复的。- @理鱼
16. 这里送一句我的开发格言:“好的日志记录能够帮助你避免和排查解决80%的线上问题。” – 黑夜路人
17. 路人兄说的。 我补充下我的。 我把php 和mysql的 slow慢执行,慢查询都打开了。 对排错非常的有用。 mysql的 慢查询记录,配合慢查询分析工具, 分析的结果来优化sql。 优化sql本身,优化索引,到分库,分表等。 php的慢执行,可以用xhprof来追踪优化处理。大多数情况,php的慢执行,都是数据库瓶颈这里。- @理鱼
18. 一般线上情况,基本都是后端慢或者某个后端服务挂了引起的,小部分情况是php写太烂引起的bug或者性能太差,所以,不要招太差技术的php开发人员。 – 黑夜路人
19. php排查,能够借助的工具是:日志记录,xphrof/xdebug。一般情况,日志记录够用了,除非想做大性能优化,才考虑,又或者你偷懒不想看别人代码,那就用xprof吧。 – 黑夜路人
20. 关于mysql连接过多的问题。 其实基本都是因为mysql的慢查询阻塞导致的。 一味的开大mysql的连接数实际上并不能提高mysql的处理吞吐。- @理鱼
21. php说完了,我们再往后端说。假设你在php层追查发现是mysql比较慢,那么,我们就去追查mysql的问题。 有请 @叶金荣 来说说,哈 – 黑夜路人
回: 20141024程序员节分享:一步到位实现MySQL优化的PPT、录音、视频观看地址:
微博微盘:http://t.cn/R7xBs2d
搜狐视频:http://t.cn/R7xBgwz
百度云盘:http://t.cn/R7xBs2e –
这里有啊 :) 大家耐心听完. 其实工具和方法无非就那几个,有些怪异问题更多靠经验以及判断力 – 叶金荣
22. 对MySQL,一般而言,瓶颈主要在磁盘IO. 最常见最弱智的就是索引了. 索引不当,会导致磁盘IO很高,CPU很高. 如果发现CPU的%USER跑得很高了,这时候第一反应就是查索引问题 – 叶金荣
回: 咋看索引问题呢 – 黑夜路人
回: slow log先定位 – Demon
回: EXPLAIN. 有索引的,也有可能进slow log – 叶金荣
23. ORM也会导致系统慢,几个方向排查
a. select语句默认查询所有的字段 => 通过select(‘field1, field2’)指定字段,排除text字段,text字段分表
b. relations导致的关联查询 => 可以的话,拆成两句,充分利用数据库索引,缓存
c. 反射数据表,生成中间文件,解析配置导致慢 => 启用缓存
d. 类库太大,导致PHP加载慢 => 启用apc,opcache,autoload缓存 – twin
24. 分享一张图片,Linux分析调优工具 http://www.beginningwithi.com/wp-content/uploads/2013/02/Screen-shot-2013-02-28-at-8.49.35-PM-624×466.png – 水浸街
25. 问: 如果遇到memcache写入频繁,怎么定位是哪个程序在写 – hei
回: 访问频繁可以使用网络监测工具实现,如netstat、nethogs等,写入频繁涉及到应用协议了,找一下memcache相关的监测工具看 – 水浸街