每一次成功的调优,都会诞生又一份的调优指南。

一些必须写在前面的军规,虽然与Java应用的调优没直接关联,但是测试同学经常不留神的地方。

1 独占你的测试机器

包括跑JMeter的那些机器。

"top"或者"pidstat -l 2 10" 看一下,其他的路人甲乙丙丁的应用都关干净了没。

如果是云主机,确保百分百占有宿主机的资源,或者深夜大家下班了你在家连VPN回来跑。

2 了解你的测试机器

必须完完全全的了解你的机器,才知道有没卡在某个瓶颈,或者与线上环境、其他测试结果的比较。

还是那句, 包括跑JMeter的那些机器。

2.1 CPU

"cat /proc/cpuinfo", 看最后一条就好,比如

processor : 23
model name : Intel(R) Xeon(R) CPU E5-2630 v2 @ 2.60GHz
physical id : 1
cpu cores : 6

所有数字都从零开始,physical id:1即两颗cpu, cpu core: 6即6核,processor : 23即24个处理器。

2 CPU * 6 Core * 2HT(Intel超线程技术) = 24 Processor

不过也有很多同事喜欢说24核,也懒得纠正了。

2.2 内存

"free -h" 没什么好说的。

2.3 硬盘

  • 查看大小、分区、文件系统类型: "df -hT"
  • 硬盘是否SCSI:/dev/sdX就是scsi的,hdX就是普通的。
  • 硬盘是否SSD : "cat /sys/block/sda/queue/rotational", 0是SSD,1是传统硬盘

普通硬盘的写速度大概100M/s,RAID级别的查看不方便,SSD的速度也不定,所以用dd测一下最靠谱:

dd if=/dev/zero of=dd.file bs=8k count=128k conv=fdatasync
dd if=/dev/zero of=./dd.file bs=1G count=1 conv=fdatasync

上面命令测试了分别以每次8k和1g的大小,写入1g文件的速度。

  • if:输入文件名, /dev/zero 设备无穷尽地提供0
  • of:输出文件名
  • bs:块大小
  • count:次数
  • conv=fdatasync :实际写盘,而不是写入Page Cache

硬盘读速度的测试同理,不过要先清理缓存,否则直接从Page Cache读了。

sh -c "sync && echo 3 > /proc/sys/vm/drop_caches”
dd if=./dd.file of=/dev/null bs=8k

2.4 网卡

先用ifconfig看看有多少块网卡和bonding。bonding是个很棒的东西,可以把多块网卡绑起来,突破单块网卡的带宽限制。

然后检查每块网卡的速度,比如"ethtool eth0"。

再检查bonding,比如"cat /proc/net/bonding/bond0", 留意其Bonding Mode是负载均衡的,再留意其捆绑的网卡的速度。

最后检查测试客户机与服务机之间的带宽,先简单ping或traceroute 一下得到RTT时间,iperf之类的可稍后。

2.5 操作系统

Linux的内核版本,是否64位: "uname -a"
Redhat/CentOS版本 : "cat /etc/redhat-release"

3. 布置好你的机器状态采集工具

讲究点,要用来出报告的,用Zabbix之类。

实时观察的,我喜欢dstat,比vmstat,iostat, sar们都好用,起码对得够齐,单位能自动转换。不过dstat需要安装(yum install dstat,如果装不上,就要将就着用vmstat,sar了)

  • dstat:默认,已有足够信息
  • dstat -am:再多一个memory信息
  • dstat -amN bond0,lo: 如果有bonding,dstat会把bond0和eth0 算双份,还有lo的也算到总量里,所以还是用-N指定网卡好。

要看IO细节,还是要用"iostat -dxm 5"

  • -d 不看cpu信息
  • -x 看细节
  • -m 以m为单位,而不以block原始size
  • 5 5秒的间隔

4. JMeter的调优顶一半的事

JMeter的版本越新越好。

4.1 JMeter的JVM参数

它默认连个垃圾收集算法都没有配,对延时要求高的,必须配上CMS或G1,内存也整大点降低GC的频率。其他的,给Server配的啥参数,给JMeter也来上一份,最好把-XX:+AggressiveOpts也加上。

4.2 测试计划的编写

什么if 语句,以及所有其实用动态语言来实现的都挺慢的。
xPath抽取结果集里的字段之类看着就慢的也别写了。
别加任何监听器和图形。
再配置输出日志的格式,能不要的列都别要了,最极端的其实就延时这列有用。

4.3 JMeter的运行

在Linux上用命令行跑,别偷懒用Window开着界面跑。
别开超过200条线程。
可以在不同机器上起多个JMeter,用集群汇总的模式。

4.4 结果的统计

初始连接,Server端热身,JVM编译热点方法等都需要时间,所以建议统计前删掉前面的一些日志。

要配置一下才能看到99.9%, 99.99% 分位数的延时,另外因为之前输出日志时省略了很多列,导入日志的时候配置也要如此。

但如果不能XWindows Forward,还要把日志下载回来再导入本地的JMeter,那还不如自己动动手,用sed, awk, sort配合一下自己写个分析延时的脚本。

另一份Java应用调优指南之-前菜的更多相关文章

  1. Java应用调优指南之-工具篇

    1. 土法调优两大件 先忆苦思甜,一般人在没有Profile工具的时候,调优的两大件,无非Heap Dump 与 Thread Dump. 1.1 Heap Dump jmap -dump:live, ...

  2. Java 性能调优指南之 Java 集合概览

    [编者按]本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文: 本 ...

  3. 5月29日 Java性能调优指南 读后感

    并行垃圾收集器 串行垃圾收集器 并发标记清除(CMS)垃圾收集器 Garbage First(G1)垃圾收集器 没有深入的学习G1的原理,只是看了大概的思想; SA工具:待学习

  4. 《linux性能及调优指南》 3.5 网络瓶颈

    3.5 Network bottlenecks A performance problem in the network subsystem can be the cause of many prob ...

  5. Java性能调优笔记

    Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...

  6. 性能测试系列-java gc调优

    性能测试中除了需要做好性能测试外,我们还需要做性能测试后的,性能调优,需要发现性能问题,也需要做性能调优,在做性能调优中,jvm的性能调优是经常遇到的一个. 随着jdk版本的迅速变化,jdk里面的GC ...

  7. Java性能调优(一):调优的流程和程序性能分析

     https://blog.csdn.net/Oeljeklaus/article/details/80656732 Java性能调优 随着应用的数据量不断的增加,系统的反应一般会越来越慢,这个时候我 ...

  8. Java性能调优:利用JMC分析性能

    Java性能调优作为大型分布式系统提供高性能服务的必修课,其重要性不言而喻. 好的分析工具能起到事半功倍的效果,利用分析利器JMC.JFR,可以实现性能问题的准确定位. 本文主要阐述如何利用JMC分析 ...

  9. 《Linux 性能及调优指南》写在后面的话

    感谢飞哥的翻译. 目前飞哥 (http://hi.baidu.com/imlidapeng)的网址已经不能访问了. <Linux 性能及调优指南>这本书的原文地址:http://www.r ...

随机推荐

  1. 深入理解shared pool共享池之library cache系列一

    结论 1,oradebug dump library_cache不同级别dump的library cache内容及粒度会有所区别,具体见测试开始部分2,本文测示基于oradebug dump libr ...

  2. oracle rowid 使用

    ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置. ROWID可以分为物理rowid和逻辑rowid两种.普通的堆表中的rowid是物理rowid,索引组织表 ...

  3. CSS 创建

    当读到一个样式表时,浏览器会根据它来格式化 HTML 文档. 如何插入样式表 插入样式表的方法有三种: 外部样式表 内部样式表 内联样式 外部样式表 当样式需要应用于很多页面时,外部样式表将是理想的选 ...

  4. Binary Tree Inorder Traversal 解题思路 ×

    问题: 非递归中序遍历二叉树 思路: 1.大循环,判断节点是否为空,栈是否为空 2.不为空:点进栈,向左走 3.为空:为空,出栈,读取值,向右走

  5. Android 学习手札(三) 视图(View)

    在Android 系统红,任何可视化组件都需要从android.view.View类继承.可以使用两种方式创建View对象. · 一种方式是使用XML来配置View的相关属性,然后使用相应的方法来装载 ...

  6. Python核心编程2第五章课后练习

    5-1 整型,讲讲python普通整型与长整型区别 python整形一共有三种:布尔型,长整型和标准整型.普通整型与长整型的区别在于标准整形的取值范围是-2^31到2^31-1,长整型所能表达的数值与 ...

  7. HIVE:用外连接替代子查询

    由于hive也支持sql,很多人会把hql跟标准sql进行比较,甚至有的时候会直接套用.hive不支持事务也不支持索引,更不支持追加写,但是对于一般的sql都是能够支持的.但是对于一些子查询确实无法支 ...

  8. 应用git(SSH设置)

    git配置完成email和user后,才可以生成SSH Key. $ git config --global user.name "自定义名称" $ git config --gl ...

  9. hduoj 1077 Catching Fish 求单位圆最多覆盖点个数

    Catching Fish Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  10. 算术编码JM实现

    h.264标准中,CABAC的算术编码部分(9.3.4)只是一个参考,实际编码器中并不一定会按照它来实现,像JM中就有自己的算术编码实现方案. 在上篇文章CABAC中有详细的算术编码描述,在了解算术编 ...