Linux性能优化参考

1、获取指标数据
使用dstat命令
dstat命令:--output 输出数据到文件 4 每多少秒刷新数据
date && dstat -tclmsdnrpy --output 功能_ip1_yyy-mm-dd_并发数.csv 4
date && dstat -tclmsdnrpy --output 功能_ip2_yyy-mm-dd_并发数.csv 4


2、关注指标
主要指标有
超时概率<=0.05% 错误概率<=0.05% tps>=预期tps
响应时间<=预期响应时间 cpu利用率<=70% 系统负载<=CPU核数*CPU个数*0.7
jvm内存使用率<=70% full gc 频率>平均半小时1次

先看内存->IO->网络->CPU

3、监控说明
包括监控:CPU 内存 磁盘I/O 网络I/O 系统负载 系统配置参数的使用情况

3-1)cpu(关注 %us %sy %wa)
top命令使用参考:https://www.cnblogs.com/wangkangluo1/archive/2012/04/18/2454993.html
大型公司CPU安全值:50%
一般公司的要求不高的项目,CPU安全值:70%
使用top命令

查看所有进程信息
top -c

查看单个进行下的所有线程信息
top -Hp pid -c

排序显示对应列数据(CPU%:P MEM%:M TIME%+:T 优先级:N)

切换显示负载和平均启动信息:l
切换显示进程和CPU信息:t
切换显示内存信息:m
切换显示命令行信息:c
top -c

cpu使用率<=70%
cpu中用户进程消耗比率 %us<50%
cpu中内核进程消耗比率 %sy<50%
cpu中用于等地IO消耗的比率 %wa<5%

%sy过高 则分析请求系统调用的资源是否出现中断、阻塞
%us过高 则分析是否存在大量或复杂的计算、低效的业务逻辑代码

时间片(CPU工作的最小单元):windows:20ms Linux:40~180ms
中断(是一组信号,软中断:CPU执行完成了需要休息,硬件中断:有更重要的事情需要处理)

3-2)内存(关注:r si so bi bo wa)
使用vmstat命令 free命令
查看内存信息
free -m
cat /proc/meminfo

vmstat -n 5
cpu利用率:us%<=50% sy%<=50 us%+sy%<=70%
cs 上下文切换:cpu利用率良好,大量的CS也是允许的
r 为可运行队列数:值过大表示CPU繁忙,每次处理器可运行队列数<=2*cpu核数*CPU个数
b 为阻塞并等待IO的进程数

swapd>0,且变动,si so为0,表示内存使用比较正常,si so值不为0,表示内存不够用
内存使用率:(free+buff+cache)/total<=70%

内存能用则用:当使用内存时,启动一个就线程时,可以直接用原来的数据。

cache:程序未处理,从硬盘中刚读取出来的数据。
buff:程序处理完,准备写入硬盘的数据。

内存的使用=use-buff-cache
未使用的内存=free+buff+cache


3-3)系统负载(关注10分钟、15分钟负载情况) CPU超过安全值,才关注该项
使用top命令或uptime命令

top命令的系统负载区域
load average: 1分钟负载数据, 5分钟负载数据, 15分钟负载数据
当前时刻CPU中正在运行和等待运行进程队列数总和,反应了CPU资源申请和分配的情况
uptime<0.7*CPU核数*CPU个数

cpu总核数=物理cpu个数*每cpu的核数
总逻辑cpu数=cpu总核数*超线程数

查看物理cpu个数
grep 'physical id' /proc/cpuinfo |sort -u|wc -l

查看cpu核数
grep 'core id' /proc/cpuinfo |sort -u |wc -l

查看cpu信息
grep 'model name' /proc/cpuinfo |sort -u |cut -f2 -d:


3-4)磁盘IO(关注:r/s w/s avgqu-sz await svctm %util)
每隔3秒刷新显示数据,显示200次,同时kByte方式显示指定dm-0磁盘的IO信息
使用iostat命令或sar命令
iostat -kx -d dm-0 3 200

小文件:<=1MB,中文件:1MB~10MB,大文件:10MB~100MB 超大文件:>100MB RAID100~RAID150

良好:await<=svctm 槽糕:await>>svctm
优良:%iowait<20% 中等:20%<=%iowait<35% 不合格:35%<=%iowait<50% 槽糕:%iowait>=50%
优良:%util<80% 槽糕:%util>=80%

安全值:A点 %idle>60% B点 %idle>40% %user<50% %iowait<70% %system使用越少越好,读写不能超过物理上线

写入跟不上:写入/读取并发,增加调用资源的权限或配置

IO瓶颈:
1)日志写入问题,调高日志级别
2)上传和下载:硬件(RAID)、软件(并发、链接处理,软件架构的一致性,异步机制)


iostat结果项
rrqm/s 每秒设备相关的读取请求有多少被合并
wrqm/s 每秒设备相关的写入请求有多少被合并

rio+wio 为总的iops
r/s 每秒完成的读I/O设备的次数 rio/s
w/s 每秒完成的写I/O设备的次数 wio/s
wkB/s 每秒写入的数据量
rkB/s 每秒读取的数据量
avgrq-sz 平均每次设备I/O操作数据大小
avgqu-sz 平均IO队列长度
await 每次设备I/O操作的等待时间(毫秒)
svctm 每次设备I/O操作的服务时间(毫秒)
%util 设备繁忙程度,每次设备在1秒钟有多少时间用于I/O操作

查看磁盘统计信息
df -halT --total

查看磁盘分区信息
cat /proc/partitions
major 主设备号 8为sda磁盘
minor 次设备号 5为第5分区
blocks 设备总块数
name 设备名称

sar命令
sar [options] [-A] [-o file] t[n]
sar -u -q -B -b -r 5 10
options 命令选项 t 采样间隔 n采用次数 -o 将结果已二进制形式存储到file文件
-a 显示所有设备信息

-p 显示指定cpu信息
-u 显示所有cpu在采样间隔时间内的信息

-b 显示缓冲区的使用情况信息
-c 显示系统调用的使用情况信息
-w 显示系统交换活动状态信息

-v 显示进程 节点 文件和锁表的状态信息
-q 显示运行队列的大小信息
-R 显示进程活动的信息

-r 显示内存使用信息
-B 显示内存分页统计信息

-d 显示系统所有磁盘信息
-g 显示串口IO信息
-a 显示系统文件读写信息
-y 显示终端设备活动情况信息

-n 显示网络运行状态信息 DEV 网络接口 EDEV 错误的网络接口 SOCK 套接字 FULL 所有

常见sar命令
查看cpu使用情况 sar -q sar -u

查看内存使用情况 sar -B sar -r

查看交换区使用情况 sar -W

查看磁盘使用情况 sar -d sar -b

查看网络使用情况 sar -n NDEN

swap:在硬盘划出一个区,以提升磁盘的读写速率,可当做内存使用。

3-5)网络I/O
建议网络带宽<=40%最大带宽
watch netstat -lunp
watch netstat -su

单个网卡使用率 A点<35%、B点<40%,双网卡使用率 A点<70%、B点<80%
丢包率 rxdrop/s txdrop/s<0.5%


3-6)系统配置参数(关注:tcp连接情况)
tcp各状态连接情况统计
netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'

netstat -nat | awk 'FNR>2{print $NF}' | sort | uniq -c

查看TIME_WAIT连接情况
netstat -n|grep 'TIME_WAIT'

解决TIME_WAIT过多的方法
vi /etc/sysctl.conf

net.ipv4.tcp_syncookies = 1 是否开启SYN Cookies(启用后,可防止SYN等待队列的溢出)
net.ipv4.tcp_tw_reuse = 1 是否开启重用(允许重复利用已开启的TCP连接)
net.ipv4.tcp_tw_recycle = 1 是否开启快速回收(开启快速回收TCP连接,防止长时间不用的TCP连接消耗资源)
开始tpc_tw_recycle时,需要设置 net.ipv4.tcp_timestamps=0 忽略报文的时间戳
net.ipv4.ip_local_port_range = 1024 65000 端口范围(扩展端口范围,防止端口不够用时,程序出现问题)
net.ipv4.tcp_max_syn_backlog = 8192 SYN队列长度(SYN队列的长度,可允许等待连接的网络连接数)
net.ipv4.tcp_fin_timeout = 30 修改系统默认的TIMEOUT时间
net.ipv4.tcp_keepalive_time = 1200 tcp发送keeplive的频度,单位为秒
net.ipv4.tcp_max_tw_buckets = 5000 保持TIME_WAIT的数量

4、监控JVM
关注内存溢出、内存泄露、线程死锁、消耗CPU资源的JAVA代码、锁争用等
4-1)jinfo(显示JVM运行时参数信息)

jinfo [ options ] [ pid ]
jinfo pid


4-2)jps(显示JVM中进程状态信息)可以获取进程ID

jps [options] [hostid]
jps -l
输出传入main、jar、类的参数信息

jps -m
输出传入mian方法的入参信息

jps -v
输出传入JVM的入参信息

jps -q
不输出传入main、jar、类的参数信息


4-3)jstack(显示进程中的线程堆栈信息 java进程ID 内核文件(core file) 远程调用服务的JAVA进程内线程的堆栈信息)
使用jstack时,如果是在64位机器上操作,则需加上参数 -J-d64
需要将用户切换到启动中间件所使用的用户,否则使用jstack会出现错误
jstack [option] pid
jstack [option] executable core
jstack [option] [server-id@]remote-hostname-or-ip


显示锁的附加信息,可以看到是否存在死锁等信息
jstack -l pid

显示java栈和C++栈等本地方法栈的信息
jstack -m pid

根据应用定位消耗资源高的线程


步骤1:ps -ef |grep '应用名称'|grep -v grep

步骤2:top -Hp pid -Mc 或 ps -Lfp pid 或 ps -mp pid -o THREAD,tid,time

步骤3:printf "%x " pid 得到16进制的数字 upid 比如:printf "%x " 326800 得到 4fc90

步骤4:jstack pid |grep upid 比如:jstack 326800 |grep 0x4fc90 根据显示的信息分析并定位引起消耗很高资源的代码

4-4)jstat(java应用程序的资源和性能进行实时监控工具,包括堆和垃圾回收信息的监控)
jstat使用:https://www.cnblogs.com/yjd_hycf_space/p/7755633.html
jstat [ option pid [interval [ s | ms ] [count] ] ]
-gcutil 输出已使用空间占总空间的百分比
-gccapacity 输出堆中各个区域使用到的最大和最小空间

4-5)jhat(堆内存dump分析工具或者用MAT,Eclipse上的工具)
jhat data.hprof 分析用jmap命令生成hprof文件
http://localhost:7000 访问报告文件

jmap -dump:format=b,file=./tmp/dump.dat pid


4-6)jcmd(内存分析工具、查看java进程、执行gc、导出线程、导出堆信息等)
jcmd [ options ]
jcmd [ pid | main-class ] PerfCounter.print
jcmd [ pid | main-class ] command [ arguments ]
jcmd [ pid | main-class ] -f file

pid 进程ID

main-class 接收命令请求进程的main类

PerfCounter.print 目标性能计数器

command[arguments]
假如要发送一个诊断命令请求到 jcmd com.example.MyClass name="Value of name argument" 则格式如下:
jcmd com.example.MyClass name="Value of name argument"


-file
从文件上读取命令,然后在目标java进程上调用这些命令,以#开头的命令或被忽略,当所有行的命令被读取完,或遇到stop关键字,
则会终止对fiel文件的处理,每个命令必须单独存为一行。


查看运行的所有虚拟机信息
jcmd -l


打印线程栈信息
jcmd pid -Thread.print

查看系统中类统计信息
jcmd pid GC.class_histogram


导出堆信息
jcmd pid GC.heap_dump

虚拟机的启动时间
jcmd pid VM.uptime

查看系统属性信息
jcmd pid VM.system_properties


查看启动参数信息
jcmd pid VM.flags

获取性能相关数据
jcmd pid PerfCount.print
jcmd 21644 help

21644:
The following commands are available:

JFR.stop
JFR.start
JFR.dump
JFR.check
Thread.print
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start

GC.rotate_log
GC.class_stats
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run

VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
VM.native_memory
VM.check_commercial_features
VM.unlock_commercial_features


4-7)jvisualvm JDK中自带的jvisualvm工具和jconsole工具,用于分析和监控JVM,推荐使用jvisualvm


5、系统负载能力浅析
并发用户数与系统的负载能力存在关联关系。
影响并发用户数的因素有:
带宽

硬件配置(cpu频率/核数、内存大小/速度、硬盘速度)

系统配置(文件描述符数量:系统中打开最大文件数,单个进程打开最大的文件数、进程或线程数量:是否采用多进程或多线模式的运行方式、TCP内核参数:Linux内核参数)

文件描述符数量
系统打开最大文件数量:临时修改:/proc/sys/fs/file-max 永久修改:/etc/sysctl.conf fs.file-max
单个进程打开最大文件数量:临时修改:ulimit -n 永久修改:/etc/security/limits.conf nofile
所有进程打开最大文件数量 需小于 /proc/sys/fs/file-max
单个进程打开最大文件数量 需小于 user limit中nofile的soft limit
nofile的soft limit不能超过其hard limit
nofile的hard limit不能超过/proc/sys/fs/nr_open

进程或线程数量:
单个用户打开的最大线程数:/etc/security/limits.conf noproc 与/usr/include/bits/local_lim.h PTHREAD_THREADS_MAX有关
系统打开的最大线程数:/proc/sys/kernel/threads-max
线程栈大小 ulimit -s

应用服务器配置(参考Apache、Nginx、Tomcat优化配置,及数据库的优化MySQL、Redis)
程序逻辑
系统架构(负载均衡、同步或异步、28原则)
nginx经典配置:
https://github.com/superhj1987/awesome-config/blob/master/nginx/nginx.conf
tomcat经典配置:
https://github.com/superhj1987/awesome-config/blob/master/tomcat/java_opts.conf
https://github.com/superhj1987/awesome-config/blob/master/tomcat/connector.conf
线程状态分析:https://www.cnblogs.com/trust-freedom/p/6606594.html
jstat使用:https://www.cnblogs.com/yjd_hycf_space/p/7755633.html

原文地址:https://www.cnblogs.com/NiceTime/p/6780084.html