二、测试工具

只说几个范例的。

1、开源工具Jmeter:这个工具现在该当是互联网压力测试的最常用工具了。
用的人多,基本上取代了 loadrunner 的地位。
apache 的项目都是牛B项目,不得不赞。
现在说是做性能测试的,这个工具不会用,那是没要被鄙视的。
由于它也是须要一些开拓功底,以是比较符合现在哀求测试开拓的潮流。
但是在一些不差钱的企业中,毕竟开源工具得不到支持。
老板们想找个替去世鬼也找不到,以是在用外包做性能测试的领域中的市场霸占率还有待提高。
现在云测试也都吹得风风火火,基本上也是各种的封装。
自己写一套多麻烦。
直接搭上一套,再写几个界面封装下,现在出去也能一个场景卖上几千块钱了。
以是在线的云测试工具中以它为根本的还是不少。
Grinder:我看这个工具最新的更新日期是 2012 年。
这个工具其实在 Jmeter 涌现之前,可惜的是没遇上好时候,我记得老早以前就看过这个工具的开拓团队涌现不合,导致工具发展缓慢。
在一些早期的互联网人里面,还有对它进行改造并形本钱身的测试平台的。
海内某大互联网厂商便是如此。
这个工具和 Jmeter 的重合度比较高,以是对初学者,我不建议同时学 Jmeter 和Grinder。
也有以它为根本改编成云测试版本的。
2、商业工具LoadRunner:这个工具不得不说,在哥刚做性能测试的时候,这工具切实其实是独步天下的。
那市场霸占率,在售前的 PPT 里,有写 85 %的,还有写 95 %的。
自满得连自己会不会都不知道了。
在 Mercury 时期的时候,确实统统都良好。
市场稳步往上升。
但是风高入夜的 2006 年 7 月 26 日惠普以 45 亿美元收购了 Mercury 公司之后,就越来越笨重。
直从 600 多M升级到 4 G旁边。
并且 HP 的市场做得出其不虞的烂。
之前一个条记本装上之后,还能跑得欢畅。
后来想运行起来就不堪重负了。
一个好好的工具,由于时期的缘故原由,再加上 HP 的市场做得如此之烂,末了也不得不逐步被开源工具霸占市场。
一个工具卖几十万、上百万。
在海内这样的商业环境下,你这定价便是在磨练自己的存活时长呀。
除了一些要拿商业工具做替罪羊的企业买 100、200 的 license 放在那里生锈、然后接着用 65536 全协议的盗版之外,彷佛现在已经没有什么出路了。
SilkPerformer: 不得不说,这个工具现在还存活着完备和中国市场没有关系。
在 borland 也是在 2006 年以 1 亿买了 segua 公司,之后在海内市场上便是半去世不活的样子。
后来 2009 年 Micro Focus 宣告以 7500 万美元收购 Borland。
这个老牌的软件企业,在欧美还是比较吃得开。
可是在海内,从压力工具的市场上来说,就那几个不温不火在外企里养老的发卖也干不出什么特色来。
以上商业工具的底层实现是从 socket 层抓起,以是从实现上来说,这是绝对的上风。
前面提到的开源工具基本上是从运用层抓起,以是在 init 部分会轻微慢一些。
不过一个 4 G的工具和一个 100 多M的工具比起来,是不是想想就以为 4 G用起来好累了? 基于现在云架构的运用,这些商业工具基本上没有什么上风。
实在从大的实现的架构上来说,这些工具可是说是没什么差异。
看好,我说的是实现的架构,不是实现的内部逻辑。
都是掌握器、负载机、分布式、多线程、共享资源池之类的思路。
以是压力工具要学习,就学 Jmeter 和 LoadRunner 就好了,据我所知,现在一些有名的互联网企业中,仍旧有用 LoadRunner破解版的。
65535 vusers 呀,估计 Jmeter 假如实现这么多,自己都撑不住了。
其余,还有些工具像:QAload/webload/openSTA/httpperf/loadUI/ab/siege 等之类的也是类似的特性。
3、小结

再次强调,不要纠结于工具,只要选择适宜的就好。
关键是看好自己想实现的目的。
从最低的本钱和最长久的发展来考虑,选择自己须要的。

性能测试工具永久不会见告你瓶颈在哪儿,它只能见告你,有瓶颈了。

php类似jprofile工具常见机能对象一览 PHP

三、监控工具

对付监控工具,可以说是五花八门。

我常常会说,监控工具的选择思路是:先全局监控,后定向定量监控。

大概说一下监控工具,基本上收费的,我都只管即便不提。
以免有打广告的嫌疑。

对付现在用到的主流环境:linux/tomcat/mysql/nginx/redis 这一套东西。
如果有人问到其他的,也可以在评论中说出来。

1、Linux

基本上对付性能剖析工程师来说,如果是单机的话,命令就已经足够。
uptime/top/vmstat/mpstat/pidstat/dstat/nethogs/iostat/sar.........多的列不完。
如果说想保存历史数据的话,建议用 prometheus 之类的工具,像这样的工具有很多种,像 casti/ Nagios 也是比较不错的。
现在很多企业都基于开源的工具做了自己的监控平台,从思路上来说大同小异。
还有些比较强的团队完备开拓自己的监控平台。
实在这个代价已经不像以前那么高了,毕竟有开源的可以做参考;要改造也有明确的方向。

2、tomcat

除了自己的 manager 页面,probe 也是个不错的选择。
当然对多个节点也是可以用上面提到的 prometheus 系列的监控工具。

3、mysql

我基本上不用繁芜的工具监控 mysql。
如果节点不多,我以为直接写 SQL 也基本上够用。
show status+slowlog 之类的。
其余,mysql 有 information schema 和 performance schema,基本上像 oracle 里的各种$视图了。
有一些工具中也带监控功能,像 mysqlworkbench。

4、redis

除了 info 之外,还有些 GUI 的监控工具,commands/misses 之类的都能看到(由于我做事器上没装,就不截图了,网上找图不像话)。
当然刚才提到的 prometheus 也可以做到。

5、nginx

实在没几个参数可以监控的。
但是它的日志很有用。
建议有条件的一定要装个日志剖析工具,实时或半实时地剖析下nginx的日志。
在配置中,也有 和upstream_response_time 两个参数可以用(个人推举用前者)。

6、小结

如果想有报警的机制,就得用监控平台像 prometheus 这样的来配置了。
如果是做运维的,这是必须的。

实在监控工具呢,可以给出的是数据是什么样的。
对付性能剖析工程师来说,不管是用商业的还是开源的还是黑市淘来的监控工具,最主要的是要知道那些值得大小各有什么差异,并且要理清数据之间的关联关系。
这才是重点。

四、代码级阐发工具

不管怎么吹,代码级阐发工具对性能本身的损耗都是存在的。

并且损耗还不小。
纵然是在偏底层做,也还是有很大的损耗。
20-30% 损耗都是正常的。

要找好代码级工具的切入点,一开始就用肯定是不理智。
只要剖析到了某一个详细的进程或线程,或者已经有了可疑代码的详细方法,再上代码级阐发工具就更有目的性了。

1、JAVA 方向

对 JAVA 来说,代码级的阐发工具有好多。
自带的就有不少,像现在 SUN JDK 中的 jvirtualVM 就可以实时看 CPU 和内存在一个方法和工具上的花费。
还有 jstack/jmap 等工具可赞助。
如果不想实时看,做下 dump 也可以看内存的占用。
但是要想看方法调用韶光就比较费劲一点。
不过现在有不少的商业工具,比如说 jprofiler,这工具直到现在还是我所见到的在 java 阐发中功能最全面的工具(它是商业的)。

不仅有树构造,还有调用图。

建议大家只管即便找到可替代的适宜的开源工具。

2、C/C++ 方向

在这个方向上,实在不止有专门的代码级阐发工具,像 valgrind, google perftools。
也有系统级的调试工具可以用。
各种的 trace工具,像 perf/systemtap/oprofile 之类的也都可用,并且内核级工具损耗要小一些。
在 solaris 上有 Dtrace,那本《性能之颠》的书里险些全是 Dtrace 工具的例子。
并且这些工具还能天生火焰图、热力争之类的。

3、其他

在其他措辞上也有相应的阐发工具可用。

像 PHP 有 Xdebug、xhprof;python 有cprofile、memoryprofiler、lineprofiler;.net有CLR profiler;Go措辞有pprof(这个是移植过来的,google perf 中的工具更多)。

不管是什么措辞,险些类似的工具都存在的。
有了这些工具,再加上系统级的调试工具,找到代码级性能问题便是分分钟的事。

五、Linux 内核调试工具

这里也把工具的利用稍提一下。
这里以 perf 为例,其他工具如果有感兴趣的,也可以来磋商,像 systemstap 之类的。
GDB 最近就不打算整了,毕竟有点老,并且利用上觉得不是顺藤摸瓜型。

perf 是大部分 linux 上都带了的工具。
一些条件条件就不提了,便是在编译内核的时候要各个选择什么的,噜苏得很。
碰着这样的问题,我一样平常都扔给另一个兄弟去处理了。
哈哈。

拿 CPU 花费为例。
这里最好带上 -g 的参数,这样可以看到类似下面这样的调用关系。
这里可以看到符号表那一列有 [k] 或者 [.],这里 [k] 的意思是内核态的;[.] 的意思是用户态的。
看你想看什么内容。

如果这里跟踪自己的运用程序,就可以直接去根据函数名找到了。

并且可以天生火焰图,如下所示,三步就可以天生。

perf script -i perf.data &> perf.unfoldperl stackcollapse-perf.pl perf.unfold &> perf.foldedperl flamegraph.pl perf.folded >perf.svg

通过 Brendan Gregg 的写好的工具(stackcollapse-perf.pl ,flamegraph.pl),基本上可以知足大部分的哀求。
有兴趣和有能力的也可以自己写一下。
Cor-Paul Bezemer 也写过一个拆分火焰图的工具 flamegraphdiff,一个页面显示三个屏,点函数名时,其他图上也会高亮显示。
如下所示:

六、前端工具

先以我所有的知识,解释一下前真个展现过程。

大致过程如上,在实际的展示过程中,有些是可以并行的。
比如 html、css下载。
这就涉及到 http1.1 协议的下载局限和浏览器支持的并发数量了。

为了能让人尽快看到页面的内容,浏览器也不会等所有的都干完了再展示,而是逐渐展示。

有的人可能看到页面是一次展示出来的,那便是前端设计得太差了。

其余,不同的浏览器用的内核不一样,以是展示的过程会有细微的差别。

还是回到工具上。

1、charlesproxy

上图展示了一个要求的韶光树,可以在性能剖析中止定出哪个元素是比较耗时的。

flow 视图展示韶光。

这个工具要说好呢,也还是不错的,但是要收费,如果和开源的其他工具一比较,这个收费就觉得不值了。

2、httpwatch

经典的视图,看着就以为舒畅。
这个瀑布视图是我以为前端性能剖析工具中做得最好看的。

各元素的相应韶光一览无余。
并且也把韶光细分的非常好。

但可惜的是它只能支持 windows,ipad,iphone。
不知道这个工具开拓者是怎么想的。

并且这个工具的专业版也收费。

3、safari 开拓者工具

如果是喜好简洁的人,这个工具一定是首选。
一如既往地 mac 风格(想想苹果把 mac 团队拆到 iphone 就很担心往后的 mac 电脑的 os 升级都有可能慢很多呀)。

并且,把几段韶光给拆分开在上面也看得很清楚,网络、js、内存、图层渲染。

又免费功能也不少。

4、chrome 开拓者工具

不仅有 safari 中的分层展示,还有倒着的火焰图,你说说,真是啥都给你想到了,只须要你睁眼看它就行。

它的网络部分,也是可以明确看到哪个地方摧残浪费蹂躏了韶光的。

又免费又好用。

5、firefox 开拓者工具

js调用关系图。

网络的瀑布视图也不错,细分也有,dns解析、SSL、发送、吸收、缓冲之类的,要啥有啥。

js火焰图也是有的,并且还挺炫丽。

性能视图的树视图,只要看一眼就知道哪慢。

性能的瀑布分的非常细,甚至于想看整体还要翻挺长。

6、小结

以上的工具中,都有对前端做调试的功能,下个断点,改个页面参数,复制要求,重发要求,自组装要求之类的。

总之,对付前真个性能剖析来说,工具真的已经做的非常完全清晰了。
假如说剖析韶光花费,看这些就够了。