分析PHP慢的原因有很多种:
比如通过xhprof.
有些通过sort/uniq的组合操作分析.
其实如果已经有了ELK(现在叫elastic stack)的话, 甚至可以更直观, 更方便前后对比.
今天来说一说如何通过分析php_slow_log快速"定位(估计)"慢的环节.
思路来源自这篇文章: http://chenlinux.com/2015/03/06/kibana4-for-slowlog/
效果图:
最外圈是调用栈最一层的比例, 第二层是调用栈第二层.
这种图可以在PHP变慢的时候可以快速查看是哪个调用栈的问题. 比如数据库调用变慢, 还是内部逻辑问题.
可惜参考文章不是通过logstash实现, 看了一下logstash, 没有比较简单的原生实现. 这又何妨, 世上无难事只怕有心人, 索性拆分方式直接改为写ruby代码:
配置文件如下: 有这样需求的同学, 拿走, 不谢.
filter { if [type] == "php_fpm_slow" { grok { match => { message => "(?m)\[(?<timestamp>\d{2}-\w{3}-\d{4} \d{2}:\d{2}:\d{2})\]\s+\[(?<pool_name>\w+\s\w+)\]\spid\s%{NUMBER:php_pid:int}\nscript_filename = %{UNIXPATH:slow_script}\n(?<php_slow_stack>\[\w{18}\] (?<slow_func>[^\[]*?:\d+).*\[\w{18}\](?<begin_func>[^\[]*?:\d+))$" } } mutate { gsub => ["php_slow_stack", "\[\w{18}\] ", ""] } ruby { code => "php_slow_stack_hash = Hash.new; if event.get('php_slow_stack'); event.get('php_slow_stack').split(/\r?\n/).each_with_index {|item, index| php_slow_stack_hash[index] = item }; end; event.set('php_slow_stack', php_slow_stack_hash)" } mutate { merge => ["php_slow_stack", "php_slow_stack"] } } } output { if [type] == "php_fpm_slow" { elasticsearch { hosts => ["10.24.252.67:9200"] index => "php-fpm-slow-log-%{+YYYY.MM.dd}" document_type => "%{type}" flush_size => 2000 idle_flush_time => 5 } } }