最强优化指令大全 | 【Linux 技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)
Linux 命令相关查看指标
CPU 指标
vmstat 指令
该命令用于每隔 n 秒采集系统的性能统计信息,共采集 m 次。
下面是对输出结果中一些字段的解释:
"r" 表示运行队列,即等待执行的进程数量。一般情况下,r 值超过 3 意味着负载较高,超过 5 则表示负载高,超过 10 则说明系统负载异常。
"bi" 和 "bo" 通常应接近 0,表示磁盘 I/O 的数据块接收和数据块发送的情况。如果这两个值较大,说明系统频繁进行磁盘 I/O 操作,可能会导致性能下降。
建议根据具体应用场景和系统需求,对这些指标进行评估和优化。如需进一步了解命令的详细用法和其他参数,请参阅相关文档或使用命令"man vmstat"获取帮助信息。
uptime 指令
uptime
命令用于显示系统的负载情况和运行时间,要使用uptime
命令查看系统的负载情况,只需在终端中输入uptime
即可。
在输出结果中,分别表示最近 1 分钟、5 分钟和 15 分钟的平均负载。
系统负载是指在某个特定时间范围内正在使用或等待 CPU 资源的进程数量。下面是对不同负载范围的解释:
如果系统平均负载小于等于 3,表示系统性能良好,可以正常运行。
如果系统平均负载小于等于 4,表示系统性能还可以,可以接受一些额外的负载。
如果系统平均负载大于 5,表示系统负载过重,可能会影响系统的性能并导致严重的问题,此时考虑扩容,例如增加 CPU 核心数量。
建议根据实际情况来评估系统负载和性能,如果系统负载过重且持续高于 5,考虑增加计算资源,如扩容或增加处理能力。
top 指令
top
命令是一个常用的系统性能监控工具,用于实时查看系统的各项指标和进程的状态。在使用top
命令时,您可以按下 "1" 键来查看每个 CPU 核心的详细指标。
在top
命令的输出中,以下是与您提到的指标相关的字段和解释:
us
:用户空间使用 CPU 的百分比。sy
:系统空间使用 CPU 的百分比。id
:CPU 空闲时间的百分比。wa
:等待 IO 完成的时间占用 CPU 的百分比。根据您的要求,如果
us <= 70
、sy <= 35
并且us + sy <= 70
,这说明系统的状态良好,用户和系统使用 CPU 的百分比都在可接受的范围内。当然,这些阈值可以根据具体需求进行调整。同时,如果
id <= 70
,表示 CPU 空闲时间较少,系统面临较大的 IO 压力。这可能意味着系统中有高负载的 IO 操作正在进行,如磁盘读写、网络传输等。需要根据实际情况来评估 IO 压力的影响。
注意,
top
命令提供了更多的系统性能指标和进程信息,您可以根据需要来进一步分析和优化系统的性能。
Memory 指标
vmstat 指令
vmstat 指标仅提供了一些关于内存使用情况的基本信息。为了更全面地了解系统的性能和资源利用情况,您还可以考虑查看其他相关指标,如 CPU 使用情况、磁盘 IO 等。这样可以更好地评估系统的整体性能状况,从而采取相应的优化措施。
swpd
:表示已使用的虚拟内存大小。如果该值大于 0,则说明您的机器物理内存不足。您可能需要考虑添加更多的物理内存或者优化内存使用情况。si
:每秒从磁盘读入虚拟内存的大小,如果这个值大于 0,表示物理内存不足,或者存在内存泄漏。您可以通过查找消耗内存的进程,并采取相应的解决措施,如调整程序配置、优化算法或考虑添加更多的物理内存。so
:表示每秒写入磁盘的虚拟内存大小,单位为 KB。如果这个值大于 0,也说明物理内存不足或存在内存泄漏的问题。您可以采取类似的解决措施,如查找造成内存写入的原因,并进行相应的调整。
Disk 指标
df 指令
df
指令用于显示文件系统的磁盘空间使用情况。
以下是对该指令输出的解释和建议:
Use%
:表示已使用的磁盘空间占比。如果Use%
小于等于 90%,则表示磁盘空间的使用程度还算正常。如果Use%
持续超过 90%,则表示磁盘空间即将耗尽,可能会导致系统性能下降或无法正常工作。
建议您定期使用 df
命令检查磁盘空间的使用情况。如果发现某个文件系统的 Use%
超过了 90%,您可以考虑以下几种解决方法:
清理不必要的文件:删除不再使用的文件或将其迁移到其他存储设备中,以释放磁盘空间。
压缩文件:对某些文件进行压缩,以减少其所占用的磁盘空间。
扩大磁盘空间:如果有足够的物理磁盘空间,您可以考虑将分区扩大,以增加磁盘空间。
请记住,在执行任何涉及文件系统操作的操作之前,请务必备份重要数据,并谨慎操作。如有需要,请根据您的具体情况和系统要求,采取适当的解决方案。
Disk IO 指标
需要明确一些具体的目标和需求。根据您提供的代码sar -d 1 1
,这是一个用于查看磁盘报告的命令,查看磁盘报告 1 1 表示间隔 1s,运行 1 次。
改进的地方包括
添加了
-1
选项,用于获取均值报告,而不是每秒的报告,以提供更具概括性的信息。使用
awk
命令筛选出包含"Average:"的行,并在输出中添加一些描述性的文本,提供更清晰的报告。
参数介绍
如果
svctm
的值与await
很接近,表示几乎没有 I/O 等待,磁盘性能很好。而如果await
的值远高于svctm
的值,表示 I/O 队列等待太长,系统上运行的应用程序将变慢。对于
%util
的说明,我根据文本内容和上下文进行了调整。当%util
接近 100%时,表示磁盘产生的 I/O 请求过多,I/O 系统已经满负荷工作,该磁盘请求饱和,可能存在瓶颈。对于
idle
的说明,我进行了改进和重新表述。如果idle
小于 70%,表示 I/O 压力较大,即有较多的 I/O 请求。
Network IO 指标
netstat 指令
该命令的作用是列出所有 TCP 连接的状态,并按照连接状态的数量进行排序,从而查看网络 IO 指标。
这个命令netstat -nat | awk '{print $6}' | sort | uniq -c | sort -rn
用于查看网络 IO 指标。我为您解释一下每个部分的含义:
netstat -nat
:netstat
是用于显示网络连接信息的命令,选项-nat
表示显示所有的 TCP 连接,不进行域名解析。awk '{print $6}'
:awk
是用于文本处理的命令,这里的语句'{print $6}'
表示打印每行的第六列,也就是网络连接的状态。sort
:sort
命令用于对文本进行排序,默认按照字母顺序进行排序。uniq -c
:行,选项
-c`表示同时计算每个行重复出现的次数。sort -rn
:sort
命令的选项-r
表示按照逆序进行排序,选项-n
表示按数字大小进行排序。
结果指令分析
根据您提供的netstat
命令的输出,目前系统中有大量的 ESTABLISHED 连接和 TIME_WAIT 连接。这是一种正常的网络连接状态,但是大量的 TIME_WAIT 连接可能会导致端口资源耗尽的问题。
在网络通信中,当两台计算机建立 TCP 连接时,会经历类似以下步骤:
客户端发送 SYN 包到服务器端,请求建立连接(状态为 SYN_SENT)。
服务器接收到 SYN 包后,发送 SYN-ACK 包作为响应,表示接受连接请求(状态为 ESTABLISHED)。
客户端接收到 SYN-ACK 包后,再发送 ACK 包作为确认(状态仍为 ESTABLISHED)。
服务器接收到 ACK 包后,连接建立完成(状态仍为 ESTABLISHED)。
客户端和服务器端进行数据传输(状态仍为 ESTABLISHED)。
连接关闭时,一方发送 FIN 包表示要关闭连接(状态为 FIN_WAIT1)。
接收到 FIN 包的一方发送 ACK 包作为确认(状态为 FIN_WAIT2)。
当双方都发送了 FIN 包并收到了对方的 ACK 后,连接关闭(状态为 TIME_WAIT)。
TIME_WAIT
TIME_WAIT 是一个连接关闭后等待一段时间的状态,用于确保网络中的所有数据包都已被接收。这是 TCP 协议的一种设计,防止旧的数据包在新连接建立时被错误地交付。
如果您发现大量的 TIME_WAIT 连接占用了大量的端口资源,可能需要调整系统的 TCP 参数,如减少 TIME_WAIT 的等待时间或增加端口范围,以避免资源耗尽的问题。
ESTABLISHED
ESTABLISHED 状态的连接表示当前仍处于活动状态的连接,数据仍在传输中。根据当前的状态统计,您可以了解到网络的连接情况和数据传输的活跃程度。
统计的量化指标
有些命令通用,有些是我根据系统的日志文件格式利用 awk/sed 两个命令结合写出来的。
网络问题排查
问题排查点:查看 TCP 连接状态
这个命令用于统计处于不同状态的网络连接的数量。
输出结果信息
逐步解释每个命令的作用:
netstat -nat
:显示所有活动的网络连接,包括 TCP 和 UDP,并显示数字格式的地址和端口号。awk '{print $6}'
:提取每行数据的第六列,即连接的状态。sort
:对提取的连接状态进行排序。uniq -c
:对排序后的连接状态进行统计,显示每个状态的数量,并去除重复项。sort -rn
:按照数量进行逆序排序。
综合起来,该命令用于统计网络连接的不同状态及其数量。它可以帮助你了解当前系统中不同连接状态的分布情况,有助于网络故障诊断和性能优化。常见的连接状态包括 ESTABLISHED(已建立连接)、TIME_WAIT(等待连接关闭)、CLOSE_WAIT(等待连接关闭)、SYN_SENT(已发送连接请求)等。通过这些统计信息,你可以追踪网络连接的状况并进行必要的排查和优化。
问题排查点:查找较多 time_wait 连接
这个命令用于查找处于"TIME_WAIT"状态的 TCP 连接,并统计这些连接的远程 IP 地址的数量。
输出结果信息-出现数量最多的前 20 行
逐步解释每个命令的作用:
netstat -n
:显示所有活动的网络连接,不解析主机名和端口号。grep TIME_WAIT
:过滤出只显示处于"TIME_WAIT"状态的连接。awk '{print $5}'
:提取每行数据的第五列,即连接的远程地址和端口。sort
:对提取的远程地址进行排序。uniq -c
:对排序后的远程地址进行统计,显示每个地址的出现次数并去除重复项。sort -rn
:按照出现次数进行逆序排序。head -n 20
:只显示前 20 个结果,即出现次数最多的前 20 个远程地址。
综合起来,该命令用于列出处于"TIME_WAIT"状态的 TCP 连接中,出现次数最多的前 20 个远程 IP 地址。这对于网络故障排查和性能优化很有帮助,可以帮助确定哪些 IP 地址频繁使用 TCP 连接并保持在"TIME_WAIT"状态。
问题排查点:查出访问靠前的 IP 地址
这个命令可以用于查看当前系统中活跃的 TCP 连接,并统计连接源 IP 地址的数量。
逐步解释每个命令的作用:
netstat -anlp
:显示所有活动的网络连接和监听端口。grep tcp
:根据关键词"tcp"过滤出只显示 TCP 连接。awk '{print $5}'
:提取每行数据的第五列,即连接的远程地址和端口。awk -F':' '{print $1}'
:根据冒号分隔符,提取远程地址部分,即去除端口号。uniq -c
:对提取的远程地址进行统计,显示每个地址的出现次数并去除重复项。sort -nr
:按照出现次数进行逆序排序。head -n3
:只显示前三个结果,即出现次数最多的前三个远程地址。
综合起来,该命令用于列出当前系统中活跃 TCP 连接中,出现次数最多的前三个远程 IP 地址。
问题排查点: 查看 TCP 参数设置信息
结果
日志内容分析
查询日志文件中耗时最高的前 5 个耗时数据值
这个命令的目的是从一个名为 hmilyylimh_sql.log
的日志文件中提取响应时间(以毫秒为单位),然后按照降序排序并输出前五个最大的响应时间。
现在我们来逐步解释每个命令的作用:
cat hmilyylimh_sql.log
:将hmilyylimh_sql.log
文件的内容输出到标准输出。awk '{print $6}'
:提取每行数据的第六列。这假设日志的每一行都由空格分隔,并且第六列包含了响应时间的信息。awk -F'ms' '{print $1}'
:使用 "ms" 作为字段分隔符,提取前一步中提取出的响应时间字段(第一列),去除末尾的 "ms" 字符串,只保留数值部分。awk -F'=' '{print $2 | "sort -r -n" }'
:使用 "=" 作为字段分隔符,提取前一步中提取出的响应时间字段(第一列),然后将其送入到sort
命令进行降序排序-r
是降序,-n
是按照数值大小排序)。head -n5
:提取排序后的结果的前五行(即前五个最大的响应时间)。
综合起来,该命令的目的是从日志文件中将响应时间提取出来,然后进行排序并输出前五个最大的响应时间。这可以帮助你找出在日志中响应时间较长的操作,以便进行性能分析和优化。
查看日志文件中耗时最高的前 5 个耗时数据值
这个指令是一个 shell 管道链,它的目的是从一个日志文件中提取出时间消耗最高的前五个数值。
让我们逐步分解这个指令的每个部分:
cat xxx.log:这个部分使用
cat
命令来读取名为"xxx.log"的日志文件并将其内容输出到标准输出。awk '{print $10}':这个部分使用
awk
命令来对输入进行处理。它使用空格作为分隔符,然后打印每行的第 10 个字段(以空格为分隔符的第 10 个部分)。awk -F'timeConsuming=' '{print $2 }':这个部分使用
awk
命令来处理上一步的输出。它使用"timeConsuming="作为分隔符,然后打印每行的第 2 个字段(以"timeConsuming="为分隔符的第 2 个部分)。awk -F'ms' '{print $1 | "sort -r -n" }':这个部分使用
awk
命令来处理上一步的输出。它使用"ms"作为分隔符,然后打印每行的第 1 个字段(以"ms"为分隔符的第 1 个部分)。然后,它使用管道将输出传递给sort -r -n
命令,根据数值进行逆序排序。head -n5:这个部分使用
head
命令来获取排序后的结果的前五行。
综上所述,该指令的作用是读取一个日志文件并按照时间消耗进行排序,然后提取出前五个时间消耗最高的数值。
查询日志文件总共打印了多少条 SQL 日志
这个指令是一个 shell 管道链,它的目的是从一个日志文件中找出出现频率最高的两个 SQL 语句。
让我们逐步分解这个指令的每个部分:
cat xxx.log:这个部分使用
cat
命令来读取名为"xxx.log"的日志文件并将其内容输出到标准输出。grep 'sql:=':这个部分使用
grep
命令来过滤包含"sql:="的行,即只选择包含该关键字的行。awk '{print $5}':这个部分使用
awk
命令来对输入进行处理。它打印每行的第 5 个字段,以空格为分隔符。uniq -c:这个部分使用
uniq
命令来对输入进行处理。它会统计并输出连续重复行的数量,并在每行前面加上重复的次数。sort -rn:这个部分使用
sort
命令来对输入进行排序。-rn
选项指定按照数值大小逆序排序。head -n2:这个部分使用
head
命令来获取排序后的结果的前两行,即频率最高的两个 SQL 语句。
综上所述,该指令的作用是从一个日志文件中找出出现频率最高的两个 SQL 语句。它首先使用grep
命令过滤包含"sql:="的行,然后使用awk
命令提取出其中的第 5 个字段,接着使用uniq
命令统计每个 SQL 语句出现的次数,并使用sort
命令按照次数逆序排序,最后使用head
命令获取排序后的前两行。
查看 sql 文件成功执行了多少条 SQL 日志
7、cat xxx.log | grep 'NormalTimeConsuming' | awk '{print $5}' | uniq -c | sort -rn | head -n2
8、cat xxx.log | grep 'BadTimeConsuming' | awk '{print $5}' | uniq -c | sort -rn | head -n2( 查看 sql 文件失败或者异常执行了多少条 SQL 日志 )
9、cat xxx.log | grep 'sendReqSupp start'| awk '{print 7$8}' | uniq -c | sort -nr | head -n2( 查询 supp 文件 sendReqSupp start 字符串出现的次数 )
问题排查点:进程和线程分析说明
主要采用lsof
,它是一个常用的命令行工具,用于显示当前系统中打开的文件和进程的相关信息。它的名称是"list open files"的缩写。
使用lsof
命令可以获取以下信息:
系统中当前打开的文件列表,包括常规文件、目录、设备文件、命名管道(FIFO)等。
每个打开文件的相关进程 ID(PID)。
文件的打开模式和权限。
打开文件的类型,如普通文件、套接字、网络连接等。
文件的位置和大小。
打开文件的用户和组。
文件打开的时间戳等。
通常,lsof
命令结合不同的选项来过滤和显示所需的信息。例如,可以使用lsof -i
来显示网络连接相关的信息,或者使用lsof -p <PID>
来显示特定进程打开的文件列表。
注意,
lsof
命令需要在具有足够权限的用户上运行,因为它会访问系统的特权文件和进程信息。在某些操作系统中,可能需要以超级用户(root)身份运行该命令。
统计持有各个进程持有句柄数最高的 10 个
这个命令行管道使用了几个不同的命令来处理lsof
的输出,并以一种有序的方式显示出最常见的进程和文件组合。
下面是命令的解释:
lsof -n
:使用lsof
命令获取当前打开文件的列表。-n
选项用于禁止解析主机名和端口号,以加快命令的执行速度。awk '{print $1,$2}'
:使用awk
命令,提取输出结果中的第一列和第二列,即进程 ID 和进程名称。{print $1,$2}
表示打印第一列和第二列。sort
:将awk
的输出结果排序,以便进行后续的统计和去重操作。uniq -c
:使用uniq
命令对相邻的相同行进行计数并合并。-c
选项用于显示每个行重复出现的次数。sort -nr
:再次对计数结果进行排序,以便按照出现次数的降序排列。head -n10
:只显示前面 10 行的结果,即显示出现次数最多的前 10 个进程和文件组合。
这个命令可以帮助你找出当前系统中打开文件最频繁的进程,并列出它们打开的文件数目。
计算所有进程持有句柄数的总和
ulimit -n 命令查看最大句柄数
查看系统打开的大文件列表前十位
系统性能计算统计分析
一次性查出系统当前的 CPU、内存、交换区的情况
查看 cpu 的统计信息(平均值)
JVM 的 GC 日志分析
在这里,我向大家推荐一本关于 JVM 优化和调优的实战系列书籍,《深入浅出 Java 虚拟机 — JVM 原理与实战》。这本书是最新出版的,内容涵盖了与我们当前工作和开发实例密切相关的技术和实战案例。通过学习这本书,我们可以深入了解 Java 虚拟机的原理,并通过实践掌握优化和调优的技巧。我诚挚地推荐这本书给大家,相信它将为我们的工作和技术发展带来巨大的收益。希望大家能够抽出时间多多学习一下这本宝贵的资料。
查看 gc 指标,新生代最后 n 条记录的新生代内存变化率
查看最后 10 条 GC 日志的堆内存已使用转化率
查看 java 日志中的问题分析
这是一个用 echo、less、grep 和 wc 命令的管道命令,用于统计特定字符串在给定日志文件中出现的次数。
解析命令的步骤如下:
echo "线程阻塞等待计数: "
:使用 echo 命令输出固定文本"线程阻塞等待计数: "。less hmilyylimh_error.log
:使用 less 命令打开名为 hmilyylimh_error.log 的日志文件,并将内容传递给下一个命令。grep "with callerRunsPolicy"
:使用 grep 命令筛选包含字符串"with callerRunsPolicy"的行。wc -l
:使用 wc 命令计算匹配到的行数。echo ", ""db事务嵌套锁AcquireLock计数: "
:使用 echo 命令输出固定文本", ""db 事务嵌套锁 AcquireLock 计数: "。重复步骤 2 至 4,只是将 grep 命令的参数替换为其他字符串,用于统计不同的计数。
echo " >>>>>>>>>>>>>>"
:使用 echo 命令输出固定文本" >>>>>>>>>>>>>>"。
注意,您需要替换 xxx_error.log 为您实际的日志文件名,以及将每个 grep 命令的参数替换为您要搜索的特定字符串。
查看具体时间点后某个字符串出现的次数
这是一个用 awk 和 grep 命令的管道命令,用于从名为 xxx.log 的日志文件中提取特定时间后包含特定字符串"xxxx"的行数。
解析该命令的步骤如下:
cat xxx.log
:使用 cat 命令读取 xxx.log 文件的内容,并通过管道传递给下一个命令。awk '{if($2>"HH:mm:ss.SSS") print $0}'
:使用 awk 命令,根据每行的第二个字段(假设是时间戳),筛选出时间晚于"HH:mm:ss.SSS"的行,并打印整行内容。请注意,您需要将"HH:mm:ss.SSS"替换为具体的时间,例如"10:30:00.000"。grep "xxxx"
:使用 grep 命令,筛选包含字符串"xxxx"的行。wc -l
:使用 wc 命令,计算匹配到的行数。
请确保将"HH:mm:ss.SSS"替换为实际的时间戳,并将"xxxx"替换为您要搜索的字符串。
版权声明: 本文为 InfoQ 作者【洛神灬殇】的原创文章。
原文链接:【http://xie.infoq.cn/article/6fc17f866c1d15883cce793bd】。文章转载请联系作者。
评论