Java面试题(三十) 面试官:“生产环境服务器变慢,你说说诊断思路和性能评估?”

一. 基本调试命令

一般我们的服务器都是跑在Linux上的,所以我们要熟悉常用的Linux命令

1. 整机:

1. top 系统性能
2. uptime 精简版
3. oad average:系统负载均衡 1min 5min 15min 系统的平均负	
载值相加除3大于60%就代表压力过大

2. CPU:

1. vmstat:查看CPU参数
vmstat -n 2 3 
第二个参数是采样的时间间隔数单位s,
第三个参数是采样的次数
	
procs
r:运行和等待CPU时间片的进程数,原则上1核CPU的运行队列不要超过2,多核系统的运行队列不能超过总核数的2倍,
否则表示系统压力过大
b:等待资源的进程数,比如正在等待磁盘I/O,网络I/O等

cpu
us:用户进程消耗cpu时间百分比,us高,用户进程消耗cpu时间多,如果长期大于50%,优化程序
sy:内核进程消耗的cpu时间百分比
us+sy:参考值为80%,如果大于80,说明可能存在cpu不足
id:处于空闲的cpu百分比
wa:系统等待IO的cpu时间百分比
st:来自于一个虚拟机偷取的cpu时间的百分比

3. 查看额外

查看所有cpu核信息:
mpstat -P ALL 2
每个进程使用cpu的用量分解信息:
pidstat -u 1 -p 进程编号

4. 内存:free

查看内存:
free -m free -g
pidstat -p 
进程编号 -r 采样间隔秒数

5. 硬盘:df

查看磁盘剩余空间:
df -h

6. 磁盘IO:iostat

磁盘I/O性能评估:
iostat -hdk 2 3

rkB/s每秒读取数据kb;

wkB/s每秒读写数据量kb

svctm I/O请求的平均服务时间,单位毫秒;

await I/O请求的平均等待时间,单位毫秒;值越小,性能越好;

util 一秒中又百分几的时间用于I/O操作,接近100%时,表示磁盘带宽跑满,需要优化程序或加磁盘rkB/s,wkB/s根据系统该应用不同回有不同的值,
但有规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取。

svctm的值与await的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await的值远高于svctm的值,则表示I/O队列等待太长,
需要优化程序或更换更快磁盘

pidstat -d 采样间隔秒数 -p 进程号

7. 网络IO:ifstat

ifstat l

二. 加入生产环境CPU占用过高,谈谈分析思路和定位?

1. 结合Linux和JDK命令一块分析

1. 步骤:

1. 先用top命令找出cpu占比最高的

2. ps -ef或者jps进一步定位,得知是一个怎样的后台程序在搞事

   1) jps -l
   
   2) ps -ef|grep java|grep -v grep
   
3. 定位到具体线程或者代码
 	定位到具体线程:
	ps -mp 进程编号 -o Thread,tid,time 
	
	-m :显示所有的线程
	-p pid 进程使用cpu的时间
	-o:该参数后是用户自定义格式
	
4. 将需要的线程ID转换为16禁止格式(英文小写格式)
	printf "%x\n" 线程ID
	
5. 查看运行轨迹,堆栈异常信息
 	jstack 进程Id|grep tid(16进制线程id小写英文) -A60

总结:在生产中碰到各种服务器问题可以使用命令去查找问题,这样是从底层出发,更加容易找到问题,解决问题。

下一篇:GitHub的骚操作

猜你喜欢

转载自blog.csdn.net/w_x_A__l__l/article/details/107155781