包的重传率
cat /proc/net/snmp 用来查看和分析 240 秒内网络包量,流量,错包,丢包。通过 RetransSegs 和 OutSegs 来计算重传率 tcpetr=RetransSegs/OutSegs。
[root@localhost ~]# cat /proc/net/snmp Ip: Forwarding DefaultTTL InReceives InHdrErrors InAddrErrors ForwDatagrams InUnknownProtos InDiscards InDelivers OutRequests OutDiscards OutNoRoutes ReasmTimeout ReasmReqds ReasmOKs ReasmFails FragOKs FragFails FragCreates Ip: 1 64 241708 0 0 0 0 0 238724 225517 15 0 0 0 0 0 0 0 0 Icmp: InMsgs InErrors InCsumErrors InDestUnreachs InTimeExcds InParmProbs InSrcQuenchs InRedirects InEchos InEchoReps InTimestamps InTimestampReps InAddrMasks InAddrMaskReps OutMsgs OutErrors OutDestUnreachs OutTimeExcds OutParmProbs OutSrcQuenchs OutRedirects OutEchos OutEchoReps OutTimestamps OutTimestampReps OutAddrMasks OutAddrMaskReps Icmp: 149 0 0 50 99 0 0 0 0 0 0 0 0 0 147 0 147 0 0 0 0 0 0 0 0 0 0 IcmpMsg: InType3 InType11 OutType3 IcmpMsg: 50 99 147 Tcp: RtoAlgorithm RtoMin RtoMax MaxConn ActiveOpens PassiveOpens AttemptFails EstabResets CurrEstab InSegs OutSegs RetransSegs InErrs OutRsts InCsumErrors Tcp: 1 200 120000 -1 376 6 0 0 4 236711 223186 292 0 4 0 Udp: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors Udp: 1405 438 0 1896 0 0 0 UdpLite: InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors InCsumErrors UdpLite: 0 0 0 0 0 0 0
重传率 = 292/223186≈0.13%
平均每秒新增 TCP 连接数:通过 /proc/net/snmp 文件得到最近 240 秒内 PassiveOpens 的增量,除以 240 得到每秒的平均增量;
机器的 TCP 连接数 :通过 /proc/net/snmp 文件的 CurrEstab 得到 TCP 连接数;
平均每秒的 UDP 接收数据报:通过 /proc/net/snmp 文件得到最近 240 秒内 InDatagrams 的增量,除以 240 得到平均每秒的 UDP 接收数据报;
平均每秒的 UDP 发送数据报:通过 /proc/net/snmp 文件得到最近 240 秒内 OutDatagrams 的增量,除以 240 得到平均每秒的 UDP 发送数据报;
磁盘瓶颈
查磁盘空间
查看磁盘剩余空间
查看磁盘剩余空间使用 df -hl 命令:
[root@localhost ~]# df -hl 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 678M 0 678M 0% /dev tmpfs 695M 0 695M 0% /dev/shm tmpfs 695M 28M 667M 4% /run tmpfs 695M 0 695M 0% /sys/fs/cgroup /dev/mapper/centos_aubin-root 27G 5.6G 22G 21% / /dev/sda1 1014M 211M 804M 21% /boot
查看磁盘已使用空间
du -sh 命令是查看磁盘已使用空间的情况,这里的 “已使用的磁盘空间” 意思是指定的文件下的整个文件层次结构所使用的空间,在没给定参数的情况下,du 报告当前目录所使用的磁盘空间。其实就是显示文件或目录所占用的磁盘空间的情况:
[root@localhost ~]# du -sh 64K
-h:输出文件系统分区使用的情况,例如:10KB,10MB,10GB 等。
-s:显示文件或整个目录的大小,默认单位是 KB。
du 的详细信息可以通过 man du 查看。
查看磁盘读写情况
查看磁盘总体读写情况
通 iostat 查看磁盘总体的读写情况:
[root@localhost ~]# iostat Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain) 2020年05月02日 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.17 0.00 0.20 0.46 0.00 99.17 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 1.56 30.45 39.61 4659620 6060644 scd0 0.00 0.02 0.00 3102 0 dm-0 1.96 30.01 38.42 4591998 5878155 dm-1 0.09 0.09 0.30 13840 45328
tps:该设备每秒的传输次数。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read: 读取的总数据量;
kB_wrtn:写入的总数量数据量;
查看磁盘详细读写情况
通过 iostat -x 1 3 可以看到磁盘详细读写情况,没隔一秒输出一次一共输出 3 次,当看到 I/O 等待时间所占 CPU 时间的比重很高的时候,首先要检查的就是机器是否正在大量使用交换空间,同时关注 iowait 占比 cpu 的消耗是否很大,如果大说明磁盘存在大的瓶颈,同时关注 await,表示磁盘的响应时间以便小于 5ms:
[root@localhost ~]# iostat -x 1 3 Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain) 2020年05月02日 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.17 0.00 0.20 0.46 0.00 99.16 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.01 0.49 0.63 0.95 30.59 39.78 89.58 0.34 214.23 49.16 323.48 8.55 1.34 scd0 0.00 0.00 0.00 0.00 0.02 0.00 98.48 0.00 1.21 1.21 0.00 0.95 0.00 dm-0 0.00 0.00 0.62 1.35 30.15 38.59 69.70 0.91 460.67 49.12 648.54 6.66 1.31 dm-1 0.00 0.00 0.02 0.07 0.09 0.30 8.52 0.04 442.74 95.43 521.17 6.91 0.06
avg-cpu 表示总体 cpu 使用情况统计信息,对于多核 cpu,这里为所有 cpu 的平均值:
%user:CPU 处在用户模式下的时间百分比。
%nice:CPU 处在带 NICE 值的用户模式下的时间百分比。
%system:CPU 处在系统模式下的时间百分比。
%iowait:CPU 等待输入输出完成时间的百分比,如果 % iowait 的值过高,表示硬盘存在 I/O 瓶颈。
%steal:管理程序维护另一个虚拟处理器时,虚拟 CPU 的无意识等待时间百分比。
%idle:CPU 空闲时间百分比,如果 % idle 值高,表示 CPU 较空闲;如果 % idle 值高但系统响应慢时,可能是 CPU 等待分配内存,应加大内存容量;如果 % idle 值持续低于 10,表明 CPU 处理能力相对较低,系统中最需要解决的资源是 CPU。。
Device 表示设备信息:
rrqm/s:每秒对该设备的读请求被合并次数,文件系统会对读取同块 (block) 的请求进行合并
wrqm/s:每秒对该设备的写请求被合并次数
r/s:每秒完成的读次数
w/s:每秒完成的写次数
rkB/s:每秒读数据量 (kB 为单位)
wkB/s:每秒写数据量 (kB 为单位)
avgrq-sz:平均每次 IO 操作的数据量 (扇区数为单位)
avgqu-sz:平均等待处理的 IO 请求队列长度
await:平均每次 IO 请求等待时间 (包括等待时间和处理时间,毫秒为单位)
svctm:平均每次 IO 请求的处理时间 (毫秒为单位)
%util:一秒中有百分之多少的时间用于 I/O 如果 % util 接近 100%,说明产生的 I/O 请求太多,I/O 系统已经满负荷。idle 小于 70% IO 压力就较大了,一般读取速度有较多的 wait。
iostat -xmd 1 3:新增 m 选项可以在输出是使用 M 为单位。
查看最耗 IO 的进程
一般先通过 iostat 查看是否存在 io 瓶颈,再使用 iotop 命令来定位那个进程最耗费 IO:
[root@localhost ~]# iotop Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 123931 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.02 % [kworker/1:30] 94208 be/4 xiaolyuh 0.00 B/s 0.00 B/s 0.00 % 0.00 % nautilus-desktop --force [gmain] 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --system --deserialize 62 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 94211 be/4 xiaolyuh 0.00 B/s 0.00 B/s 0.00 % 0.00 % gvfsd-trash --spawner :1.4 /org/gtk/gvfs/exec_spaw/0 4 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H] 6 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched] 10 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [lru-add-drain] ...
通过 iotop -p pid 可以查看单个进程的 IO 情况:
[root@localhost ~]# iotop -p 124146 Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 124146 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % java -jar arthas-demo.jar
应用瓶颈
查看某个进程的 PID
如查看 java 的进程的 pid,ps -ef | grep java:
[root@localhost ~]# ps -ef | grep java root 124146 1984 0 09:13 pts/0 00:00:06 java -jar arthas-demo.jar root 125210 98378 0 10:07 pts/1 00:00:00 grep --color=auto java
查看特定进程的数量
如查看 java 进程的数量,ps -ef | grep java| wc -l:
[root@localhost ~]# ps -ef | grep java| wc -l
查看线程是否存在死锁
查看线程是否存在死锁,jstack -l pid:
[root@localhost ~]# jstack -l 124146 2020-05-02 10:13:38 Full thread dump OpenJDK 64-Bit Server VM (25.252-b09 mixed mode): "C1 CompilerThread1" #6 daemon prio=9 os_prio=0 tid=0x00007f27f013c000 nid=0x1e4f9 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f27f012d000 nid=0x1e4f8 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE Locked ownable synchronizers: - None "main" #1 prio=5 os_prio=0 tid=0x00007f27f004b800 nid=0x1e4f3 waiting on condition [0x00007f27f7274000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386) at demo.MathGame.main(MathGame.java:17) Locked ownable synchronizers: - None ...
查看某个进程的线程数
ps -efL | grep [PID] | wc -l,如: [root@localhost ~]# ps -efL | grep 124146 | wc -l 12 1
查看具体有哪些线程用 ps -Lp [pid] cu:
[root@localhost ~]# ps -Lp 124146 cu USER PID LWP %CPU NLWP %MEM VSZ RSS TTY STAT START TIME COMMAND root 124146 124146 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 java root 124146 124147 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:01 java root 124146 124148 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 VM Thread root 124146 124149 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 Reference Handl root 124146 124150 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 Finalizer root 124146 124151 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 Signal Dispatch root 124146 124152 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 C2 CompilerThre root 124146 124153 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 C1 CompilerThre root 124146 124154 0.0 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:00 Service Thread root 124146 124155 0.1 11 2.5 2489116 35724 pts/0 Sl+ 09:13 0:05 VM Periodic Tas root 124146 125362 0.0 11 2.5 2489116 35724 pts/0 Sl+ 10:13 0:00 Attach Listener
统计所有的 log 文件中,包含 Error 字符的行
find / -type f -name "*.log" | xargs grep "ERROR",这个在排查问题过程中比较有用:
[root@localhost ~]# find / -type f -name "*.log" | xargs grep "ERROR" /var/log/tuned/tuned.log:2020-03-13 18:05:59,145 ERROR tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor' error: '[Errno 19] No such device' /var/log/tuned/tuned.log:2020-03-13 18:05:59,145 ERROR tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor' error: '[Errno 19] No such device' /var/log/tuned/tuned.log:2020-04-28 14:55:34,857 ERROR tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor' error: '[Errno 19] No such device' /var/log/tuned/tuned.log:2020-04-28 14:55:34,859 ERROR tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu1/cpufreq/scaling_governor' error: '[Errno 19] No such device' /var/log/tuned/tuned.log:2020-04-28 15:23:19,037 ERROR tuned.utils.commands: Writing to file '/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor' error: '[Errno 19] No such device' ...
应用启动时指定 JVM 参数
java -jar -Xms128m -Xmx1024m -Xss512k -XX:PermSize=128m -XX:MaxPermSize=64m -XX:NewSize=64m -XX:MaxNewSize=256m arthas-demo.jar,
如:
[root@localhost ~]# java -jar -Xms128m -Xmx1024m -Xss512k -XX:PermSize=128m -XX:MaxPermSize=64m -XX:NewSize=64m -XX:MaxNewSize=256m arthas-demo.jar OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0 OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64m; support was removed in 8.0 157518=2*3*3*3*2917 illegalArgumentCount: 1, number is: -187733, need >= 2 illegalArgumentCount: 2, number is: -102156, need >= 2 173379=3*57793
总结
在使用 linux 命令时,如果想看帮助可以使用 --help 或者 man 查看帮助信息:
[root@localhost ~]# grep --help 用法: grep [选项]... PATTERN [FILE]... 在每个 FILE 或是标准输入中查找 PATTERN。 默认的 PATTERN 是一个基本正则表达式(缩写为 BRE)。 例如: grep -i 'hello world' menu.h main.c ... [root@localhost ~]# man grep GREP(1) General Commands Manual GREP(1) NAME grep, egrep, fgrep - 打印匹配给定模式的行 总览 SYNOPSIS grep [options] PATTERN [FILE...] grep [options] [-e PATTERN | -f FILE] [FILE...] 描述 DESCRIPTION Grep 搜索以 FILE 命名的文件输入 (或者是标准输入,如果没有指定文件名,或者给出的文件名是 - 的话),寻找含有与给定的模式 PATTERN ...