最强优化指令大全 | 【Linux技术专题】「系统性能调优实战」终极关注应用系统性能调优及原理剖析(下册)

Linux命令相关查看指标

CPU 指标

vmstat指令

vmstat -n m

该命令用于每隔n秒采集系统的性能统计信息,共采集m次。

    [root@svr01]$ vmstat 1 3procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st0  0 206944 633564  29876 1252176    0    0    10    27    0    0  1  1 98  0  00  0 206944 634232  29876 1252192    0    0     0     0  811 1504  1  1 98  0  00  0 206944 634480  29876 1252264    0    0     0     0  951 1458  6  1 93  0  0

下面是对输出结果中一些字段的解释:

  • “r” 表示运行队列,即等待执行的进程数量。一般情况下,r值超过3意味着负载较高,超过5则表示负载高,超过10则说明系统负载异常。
  • “bi” 和 “bo” 通常应接近0,表示磁盘I/O的数据块接收和数据块发送的情况。如果这两个值较大,说明系统频繁进行磁盘I/O操作,可能会导致性能下降。

建议根据具体应用场景和系统需求,对这些指标进行评估和优化。如需进一步了解命令的详细用法和其他参数,请参阅相关文档或使用命令"man vmstat"获取帮助信息。

uptime指令

uptime命令用于显示系统的负载情况和运行时间,要使用uptime命令查看系统的负载情况,只需在终端中输入uptime即可。

[root@svr01]$ uptime
21:27:44 up 207 days, 11:15, 1 user, load average: 26.45, 16.76, 7.50

在输出结果中,分别表示最近1分钟、5分钟和15分钟的平均负载。

系统负载是指在某个特定时间范围内正在使用或等待CPU资源的进程数量。下面是对不同负载范围的解释:

  • 如果系统平均负载小于等于3,表示系统性能良好,可以正常运行。
  • 如果系统平均负载小于等于4,表示系统性能还可以,可以接受一些额外的负载。
  • 如果系统平均负载大于5,表示系统负载过重,可能会影响系统的性能并导致严重的问题,此时考虑扩容,例如增加CPU核心数量。

建议根据实际情况来评估系统负载和性能,如果系统负载过重且持续高于5,考虑增加计算资源,如扩容或增加处理能力。

top指令

top命令是一个常用的系统性能监控工具,用于实时查看系统的各项指标和进程的状态。在使用top命令时,您可以按下 “1” 键来查看每个 CPU 核心的详细指标。

Tasks: 332 total,   3 running, 294 sleeping,   0 stopped,  35 zombie
%Cpu0  :  6.3 us,  3.1 sy,  0.0 ni, 89.2 id,  0.0 wa,  0.0 hi,  0.3 si,  1.0 st
%Cpu1  :  6.6 us,  3.8 sy,  0.0 ni, 88.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.7 st
%Cpu2  :  7.2 us,  2.4 sy,  0.0 ni, 88.6 id,  0.3 wa,  0.0 hi,  0.0 si,  1.4 st
%Cpu3  :  8.4 us,  2.8 sy,  0.0 ni, 87.8 id,  0.0 wa,  0.0 hi,  0.0 si,  1.0 st
KiB Mem : 16418244 total,   204416 free, 14031720 used,  2182108 buff/cache
KiB Swap:  2096444 total,  2096444 free,        0 used.  1249020 avail Mem 

top命令的输出中,以下是与您提到的指标相关的字段和解释:

  • us:用户空间使用CPU的百分比。

  • sy:系统空间使用CPU的百分比。

  • id:CPU空闲时间的百分比。

  • wa:等待IO完成的时间占用CPU的百分比。

  • 根据您的要求,如果us <= 70sy <= 35并且 us + sy <= 70,这说明系统的状态良好,用户和系统使用CPU的百分比都在可接受的范围内。当然,这些阈值可以根据具体需求进行调整。

  • 同时,如果id <= 70,表示CPU空闲时间较少,系统面临较大的IO压力。这可能意味着系统中有高负载的IO操作正在进行,如磁盘读写、网络传输等。需要根据实际情况来评估IO压力的影响。

注意,top命令提供了更多的系统性能指标和进程信息,您可以根据需要来进一步分析和优化系统的性能。

Memory指标

vmstat指令

vmstat指标仅提供了一些关于内存使用情况的基本信息。为了更全面地了解系统的性能和资源利用情况,您还可以考虑查看其他相关指标,如CPU使用情况、磁盘IO等。这样可以更好地评估系统的整体性能状况,从而采取相应的优化措施。

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st1  0      0 179892  99456 2093616    0    0    10    23    0    0 18  3 78  0  11  0      0 179644  99456 2093648    0    0     0    84 6610 8943  9  3 87  0  11  0      0 179484  99464 2093756    0    0     0    44 5788 8207  7  3 90  0  1
  • swpd:表示已使用的虚拟内存大小。如果该值大于0,则说明您的机器物理内存不足。您可能需要考虑添加更多的物理内存或者优化内存使用情况。
  • si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不足,或者存在内存泄漏。您可以通过查找消耗内存的进程,并采取相应的解决措施,如调整程序配置、优化算法或考虑添加更多的物理内存。
  • so:表示每秒写入磁盘的虚拟内存大小,单位为KB。如果这个值大于0,也说明物理内存不足或存在内存泄漏的问题。您可以采取类似的解决措施,如查找造成内存写入的原因,并进行相应的调整。

Disk 指标

df指令

df 指令用于显示文件系统的磁盘空间使用情况。

Filesystem                         1K-blocks     Used Available Use% Mounted on
devtmpfs                             8198728        0   8198728   0% /dev
tmpfs                                8209120        0   8209120   0% /dev/shm
tmpfs                                8209120   785368   7423752  10% /run
tmpfs                                8209120        0   8209120   0% /sys/fs/cgroup
/dev/xvda2                          24740988  3240172  20242588  14% /
/dev/xvda1                            999320   191032    755860  21% /boot
/dev/xvdc                          103080888 36598152  61223472  38% /data
overlay                            103080888 36598152  61223472  38% /data/docker/overlay2/14146e9df2cb2a01b247b6e6925a7cb336a240a951e517125fa5b195dd760cdc/merged
overlay                            103080888 36598152  61223472  38% /data/docker/overlay2/1e98b0940b332728355b96f0332ab6f0ed4d66fdacea8494d655ed78d4f0be65/merged
overlay                            103080888 36598152  61223472  38% /data/docker/overlay2/2c514a97956be0fbf4091282be6b298e7289344fca5f147b036211f220b6432c/merged
overlay                            103080888 36598152  61223472  38% /data/docker/overlay2/ea8e09ba0e5d86f96801d437e6939490c575ac77dc6951887c14ab3057559e39/merged
overlay                            103080888 36598152  61223472  38% /data/docker/overlay2/667133fede8fb8196919c59204f80cd0687baa2fd0bfd8fa4de0656aadb4d649/merged
overlay                            103080888 36598152  61223472  38% /data/docker/overlay2/d3fbcf704f77b369f8929db30edbb34d70ddcfe3cbd666050244fd604bea391b/merged
shm                                    65536        0     65536   0% /data/docker/containers/2dc760e7813cb27ffc9b3fd40507af548ddb54d90406c6f39dd22d47fb01ad91/mounts/shm

以下是对该指令输出的解释和建议:

  • Use%:表示已使用的磁盘空间占比。如果 Use% 小于等于 90%,则表示磁盘空间的使用程度还算正常。如果 Use% 持续超过 90%,则表示磁盘空间即将耗尽,可能会导致系统性能下降或无法正常工作。

建议您定期使用 df 命令检查磁盘空间的使用情况。如果发现某个文件系统的 Use% 超过了 90%,您可以考虑以下几种解决方法:

  1. 清理不必要的文件:删除不再使用的文件或将其迁移到其他存储设备中,以释放磁盘空间。
  2. 压缩文件:对某些文件进行压缩,以减少其所占用的磁盘空间。
  3. 扩大磁盘空间:如果有足够的物理磁盘空间,您可以考虑将分区扩大,以增加磁盘空间。

请记住,在执行任何涉及文件系统操作的操作之前,请务必备份重要数据,并谨慎操作。如有需要,请根据您的具体情况和系统要求,采取适当的解决方案。

Disk IO指标

需要明确一些具体的目标和需求。根据您提供的代码sar -d 1 1,这是一个用于查看磁盘报告的命令,查看磁盘报告 1 1 表示间隔1s,运行1次。

sar -d -1 1 | awk '/Average:/{print "Disk report: \n\n" $0}'

改进的地方包括

  1. 添加了-1选项,用于获取均值报告,而不是每秒的报告,以提供更具概括性的信息。
  2. 使用awk命令筛选出包含"Average:"的行,并在输出中添加一些描述性的文本,提供更清晰的报告。
    [root@svr01]$ sar -d 1 1Linux 2.6.32-642.6.2.el6.x86_64 (SHB-L0044551) 07/20/2018 _x86_64_ (1 CPU)03:00:23 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util03:00:24 PM dev252-0 23.00 808.00 80.00 38.61 9.88 375.35 43.48 100.0003:00:24 PM dev252-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0003:00:24 PM dev253-0 4.00 448.00 0.00 112.00 1.11 222.00 249.50 99.8003:00:24 PM dev253-1 50.00 400.00 0.00 8.00 24.40 523.20 20.00 100.0003:00:24 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0003:00:24 PM dev253-3 3.00 32.00 0.00 10.67 0.99 242.33 331.67 99.5003:00:24 PM dev253-4 0.00 0.00 0.00 0.00 1.61 0.00 0.00 100.0003:00:24 PM dev253-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.0003:00:24 PM dev253-6 3.00 0.00 24.00 8.00 1.30 393.67 261.33 78.40Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %utilAverage: dev252-0 23.00 808.00 80.00 38.61 9.88 375.35 43.48 100.00Average: dev252-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00Average: dev253-0 4.00 448.00 0.00 112.00 1.11 222.00 249.50 99.80Average: dev253-1 50.00 400.00 0.00 8.00 24.40 523.20 20.00 100.00Average: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00Average: dev253-3 3.00 32.00 0.00 10.67 0.99 242.33 331.67 99.50Average: dev253-4 0.00 0.00 0.00 0.00 1.61 0.00 0.00 100.00Average: dev253-5 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00Average: dev253-6 3.00 0.00 24.00 8.00 1.30 393.67 261.33 78.40
参数介绍
  1. 如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好。而如果await的值远高于svctm的值,表示I/O队列等待太长,系统上运行的应用程序将变慢。

  2. 对于%util的说明,我根据文本内容和上下文进行了调整。当%util接近100%时,表示磁盘产生的I/O请求过多,I/O系统已经满负荷工作,该磁盘请求饱和,可能存在瓶颈。

  3. 对于idle的说明,我进行了改进和重新表述。如果idle小于70%,表示I/O压力较大,即有较多的I/O请求。

Network IO指标

netstat指令

该命令的作用是列出所有TCP连接的状态,并按照连接状态的数量进行排序,从而查看网络IO指标。

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

这个命令netstat -nat | awk '{print $6}' | sort | uniq -c | sort -rn用于查看网络IO指标。我为您解释一下每个部分的含义:

  • netstat -natnetstat是用于显示网络连接信息的命令,选项-nat表示显示所有的TCP连接,不进行域名解析。
  • awk '{print $6}'awk是用于文本处理的命令,这里的语句'{print $6}'表示打印每行的第六列,也就是网络连接的状态。
  • sortsort命令用于对文本进行排序,默认按照字母顺序进行排序。
  • uniq -c 行,选项-c`表示同时计算每个行重复出现的次数。
  • sort -rnsort命令的选项-r表示按照逆序进行排序,选项-n表示按数字大小进行排序。
结果指令分析

根据您提供的netstat命令的输出,目前系统中有大量的ESTABLISHED连接和TIME_WAIT连接。这是一种正常的网络连接状态,但是大量的TIME_WAIT连接可能会导致端口资源耗尽的问题

在网络通信中,当两台计算机建立TCP连接时,会经历类似以下步骤:

  1. 客户端发送SYN包到服务器端,请求建立连接(状态为SYN_SENT)。
  2. 服务器接收到SYN包后,发送SYN-ACK包作为响应,表示接受连接请求(状态为ESTABLISHED)。
  3. 客户端接收到SYN-ACK包后,再发送ACK包作为确认(状态仍为ESTABLISHED)。
  4. 服务器接收到ACK包后,连接建立完成(状态仍为ESTABLISHED)。
  5. 客户端和服务器端进行数据传输(状态仍为ESTABLISHED)。
  6. 连接关闭时,一方发送FIN包表示要关闭连接(状态为FIN_WAIT1)。
  7. 接收到FIN包的一方发送ACK包作为确认(状态为FIN_WAIT2)。
  8. 当双方都发送了FIN包并收到了对方的ACK后,连接关闭(状态为TIME_WAIT)。
TIME_WAIT

TIME_WAIT是一个连接关闭后等待一段时间的状态,用于确保网络中的所有数据包都已被接收。这是TCP协议的一种设计,防止旧的数据包在新连接建立时被错误地交付

如果您发现大量的TIME_WAIT连接占用了大量的端口资源,可能需要调整系统的TCP参数,如减少TIME_WAIT的等待时间或增加端口范围,以避免资源耗尽的问题。

ESTABLISHED

ESTABLISHED状态的连接表示当前仍处于活动状态的连接,数据仍在传输中。根据当前的状态统计,您可以了解到网络的连接情况和数据传输的活跃程度。

统计的量化指标

有些命令通用,有些是我根据系统的日志文件格式利用awk/sed两个命令结合写出来的。

网络问题排查

问题排查点:查看TCP连接状态

这个命令用于统计处于不同状态的网络连接的数量。

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 

输出结果信息

[root@ibm-pru-master ~]# netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 248 ESTABLISHED56 TIME_WAIT46 LISTEN10 CLOSE_WAIT1 Foreign1 established)

逐步解释每个命令的作用:

  1. netstat -nat:显示所有活动的网络连接,包括TCP和UDP,并显示数字格式的地址和端口号。

  2. awk '{print $6}':提取每行数据的第六列,即连接的状态。

  3. sort:对提取的连接状态进行排序。

  4. uniq -c:对排序后的连接状态进行统计,显示每个状态的数量,并去除重复项。

  5. sort -rn:按照数量进行逆序排序。

综合起来,该命令用于统计网络连接的不同状态及其数量。它可以帮助你了解当前系统中不同连接状态的分布情况,有助于网络故障诊断和性能优化。常见的连接状态包括ESTABLISHED(已建立连接)、TIME_WAIT(等待连接关闭)、CLOSE_WAIT(等待连接关闭)、SYN_SENT(已发送连接请求)等。通过这些统计信息,你可以追踪网络连接的状况并进行必要的排查和优化。

问题排查点:查找较多time_wait连接

这个命令用于查找处于"TIME_WAIT"状态的TCP连接,并统计这些连接的远程IP地址的数量。

netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n 20

输出结果信息-出现数量最多的前20行

[root@ibm-pru-master ~]# netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n 2010 10.42.0.194:80809 10.42.0.191:70012 10.42.0.192:50092 10.42.0.188:80801 127.0.0.1:454201 127.0.0.1:452381 127.0.0.1:450641 127.0.0.1:448821 127.0.0.1:419561 127.0.0.1:417701 127.0.0.1:415921 127.0.0.1:414101 10.42.0.184:80801 10.116.53.174:426781 10.116.53.174:426241 10.116.53.174:425541 10.116.53.174:425101 10.116.53.174:424281 10.116.53.174:423861 10.116.53.174:42320

逐步解释每个命令的作用:

  1. netstat -n:显示所有活动的网络连接,不解析主机名和端口号。

  2. grep TIME_WAIT:过滤出只显示处于"TIME_WAIT"状态的连接。

  3. awk '{print $5}':提取每行数据的第五列,即连接的远程地址和端口。

  4. sort:对提取的远程地址进行排序。

  5. uniq -c:对排序后的远程地址进行统计,显示每个地址的出现次数并去除重复项。

  6. sort -rn:按照出现次数进行逆序排序。

  7. head -n 20:只显示前20个结果,即出现次数最多的前20个远程地址。

综合起来,该命令用于列出处于"TIME_WAIT"状态的TCP连接中,出现次数最多的前20个远程IP地址。这对于网络故障排查和性能优化很有帮助,可以帮助确定哪些IP地址频繁使用TCP连接并保持在"TIME_WAIT"状态。

问题排查点:查出访问靠前的IP地址

这个命令可以用于查看当前系统中活跃的TCP连接,并统计连接源IP地址的数量。

netstat -anlp|grep tcp |awk '{print $5}' |awk -F':' '{print $1}' |uniq -c |sort -nr | head -n3

逐步解释每个命令的作用:

  1. netstat -anlp:显示所有活动的网络连接和监听端口。

  2. grep tcp:根据关键词"tcp"过滤出只显示TCP连接。

  3. awk '{print $5}':提取每行数据的第五列,即连接的远程地址和端口。

  4. awk -F':' '{print $1}':根据冒号分隔符,提取远程地址部分,即去除端口号。

  5. uniq -c:对提取的远程地址进行统计,显示每个地址的出现次数并去除重复项。

  6. sort -nr:按照出现次数进行逆序排序。

  7. head -n3:只显示前三个结果,即出现次数最多的前三个远程地址。

综合起来,该命令用于列出当前系统中活跃TCP连接中,出现次数最多的前三个远程IP地址。

问题排查点: 查看TCP参数设置信息

cat /etc/sysctl.conf | grep 'tcp_'
结果
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle = 0

日志内容分析

查询日志文件中耗时最高的前5个耗时数据值

cat xxx.log | awk '{print $6}' | awk -F'ms' '{print $1}' | awk -F'=' '{print $2 | "sort -r -n"  }' | head -n5

这个命令的目的是从一个名为 hmilyylimh_sql.log 的日志文件中提取响应时间(以毫秒为单位),然后按照降序排序并输出前五个最大的响应时间。

现在我们来逐步解释每个命令的作用:

  1. cat hmilyylimh_sql.log:将 hmilyylimh_sql.log 文件的内容输出到标准输出。

  2. awk '{print $6}':提取每行数据的第六列。这假设日志的每一行都由空格分隔,并且第六列包含了响应时间的信息。

  3. awk -F'ms' '{print $1}':使用 “ms” 作为字段分隔符,提取前一步中提取出的响应时间字段(第一列),去除末尾的 “ms” 字符串,只保留数值部分。

  4. awk -F'=' '{print $2 | "sort -r -n" }':使用 “=” 作为字段分隔符,提取前一步中提取出的响应时间字段(第一列),然后将其送入到 sort 命令进行降序排序 -r 是降序,-n 是按照数值大小排序)。

  5. head -n5:提取排序后的结果的前五行(即前五个最大的响应时间)。

综合起来,该命令的目的是从日志文件中将响应时间提取出来,然后进行排序并输出前五个最大的响应时间。这可以帮助你找出在日志中响应时间较长的操作,以便进行性能分析和优化。

查看日志文件中耗时最高的前5个耗时数据值

这个指令是一个shell管道链,它的目的是从一个日志文件中提取出时间消耗最高的前五个数值。

cat xxx.log | awk '{print $10}' | awk -F'timeConsuming=' '{print $2 }' | awk -F'ms' '{print $1 | "sort -r -n" }' | head -n5

让我们逐步分解这个指令的每个部分:

  1. cat xxx.log:这个部分使用cat命令来读取名为"xxx.log"的日志文件并将其内容输出到标准输出。
  2. awk ‘{print $10}’:这个部分使用awk命令来对输入进行处理。它使用空格作为分隔符,然后打印每行的第10个字段(以空格为分隔符的第10个部分)。
  3. awk -F’timeConsuming=’ ‘{print $2 }’:这个部分使用awk命令来处理上一步的输出。它使用"timeConsuming="作为分隔符,然后打印每行的第2个字段(以"timeConsuming="为分隔符的第2个部分)。
  4. awk -F’ms’ ‘{print $1 | “sort -r -n” }’:这个部分使用awk命令来处理上一步的输出。它使用"ms"作为分隔符,然后打印每行的第1个字段(以"ms"为分隔符的第1个部分)。然后,它使用管道将输出传递给sort -r -n命令,根据数值进行逆序排序。
  5. head -n5:这个部分使用head命令来获取排序后的结果的前五行。

综上所述,该指令的作用是读取一个日志文件并按照时间消耗进行排序,然后提取出前五个时间消耗最高的数值。

查询日志文件总共打印了多少条SQL日志

这个指令是一个shell管道链,它的目的是从一个日志文件中找出出现频率最高的两个SQL语句。

cat xxx.log | grep 'sql:=' | awk '{print $5}' | uniq -c | sort -rn | head -n2

让我们逐步分解这个指令的每个部分:

  1. cat xxx.log:这个部分使用cat命令来读取名为"xxx.log"的日志文件并将其内容输出到标准输出。
  2. grep ‘sql:=’:这个部分使用grep命令来过滤包含"sql:="的行,即只选择包含该关键字的行。
  3. awk ‘{print $5}’:这个部分使用awk命令来对输入进行处理。它打印每行的第5个字段,以空格为分隔符。
  4. uniq -c:这个部分使用uniq命令来对输入进行处理。它会统计并输出连续重复行的数量,并在每行前面加上重复的次数。
  5. sort -rn:这个部分使用sort命令来对输入进行排序。-rn选项指定按照数值大小逆序排序。
  6. 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 $6$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 | awk '{print $1,$2}' | sort | uniq -c | sort -nr | head -n10

下面是命令的解释:

  1. lsof -n:使用lsof命令获取当前打开文件的列表。-n选项用于禁止解析主机名和端口号,以加快命令的执行速度。

  2. awk '{print $1,$2}':使用awk命令,提取输出结果中的第一列和第二列,即进程ID和进程名称。{print $1,$2}表示打印第一列和第二列。

  3. sort:将awk的输出结果排序,以便进行后续的统计和去重操作。

  4. uniq -c:使用uniq命令对相邻的相同行进行计数并合并。-c选项用于显示每个行重复出现的次数。

  5. sort -nr:再次对计数结果进行排序,以便按照出现次数的降序排列。

  6. head -n10:只显示前面10行的结果,即显示出现次数最多的前10个进程和文件组合。

这个命令可以帮助你找出当前系统中打开文件最频繁的进程,并列出它们打开的文件数目。

计算所有进程持有句柄数的总和

lsof -n | awk '{print $1,$2}' | sort | uniq -c | sort -nr | awk '{ sum+=$1 };END { print sum } '

ulimit -n命令查看最大句柄数

查看系统打开的大文件列表前十位

lsof | awk 'NF == 9 { print $0}' | sort +6 -7nr | head -n10
atop      3820380                              root    4u      raw                           0t0            914054642 00000000:00FF->00000000:0000 st=07
java      3489884                              root    6w      REG              0,173  656792832              4980976 /root/logs/rocketmqlogs/rocketmq_client.log
java      3490398                              root  161w      REG              0,298  548992765              4980977 /root/logs/rocketmqlogs/rocketmq_client.log
java      1391394                              root    7w      REG              0,312  242051534              4980978 /root/logs/rocketmqlogs/rocketmq_client.log
java      1391403                              root    7w      REG              0,311  164138666              4980979 /root/logs/rocketmqlogs/rocketmq_client.log
java      1391394                              root    3r      REG              0,312  141001128              3801406 /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
java      1391403                              root    3r      REG              0,311  141001128              3801406 /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
java      3489884                              root    3r      REG              0,173  141001128              3801406 /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
java      3490398                              root    3r      REG              0,298  141001128              3801406 /usr/lib/jvm/java-11-openjdk-amd64/lib/modules
kube-apis  249519                              root  txt       REG               0,92  118308864              2760920 /usr/local/bin/kube-apiserver

系统性能计算统计分析

一次性查出系统当前的CPU、内存、交换区的情况
top -b -n 1 | grep -E 'Cpu\(s\)|Mem|Swap'%Cpu(s):  2.7 us,  6.8 sy,  0.0 ni, 89.2 id,  0.0 wa,  0.0 hi,  1.4 si,  0.0 st
KiB Mem : 16418244 total,   228296 free, 14079452 used,  2110496 buff/cache
KiB Swap:  2096444 total,  2096444 free,        0 used.  1168228 avail Mem 
查看cpu的统计信息(平均值)
iostat -p sda | awk -F'Device' '{ print $1 }'

JVM的GC日志分析

在这里,我向大家推荐一本关于JVM优化和调优的实战系列书籍,《深入浅出Java虚拟机 — JVM原理与实战》。这本书是最新出版的,内容涵盖了与我们当前工作和开发实例密切相关的技术和实战案例。通过学习这本书,我们可以深入了解Java虚拟机的原理,并通过实践掌握优化和调优的技巧。我诚挚地推荐这本书给大家,相信它将为我们的工作和技术发展带来巨大的收益。希望大家能够抽出时间多多学习一下这本宝贵的资料
在这里插入图片描述
【当当-点击链接】【京东-点击链接】

查看gc指标,新生代最后n条记录的新生代内存变化率
cat gc.log | tail -n20|awk '{print $4}'| awk -F'->' '{print $1, $2, $3 }'| awk -F'(' '{print $1, $2, $3}' | awk -F')' '{print $1}' | awk -F'K' '{print $1/$3*100,  "% used  ->     "  ,$2/$3*100, "% used     " , 100-$2/$3*100, "% free      ",  $3/1024, "M total     ---    新生代" }'
查看最后10条GC日志的堆内存已使用转化率
cat gc.log | tail -n20 | awk '{print $7}' | awk -F'->' '{print $1, $2, $3 }' | awk -F'(' '{print $1, $2, $3}' | awk -F')' '{print $1}' | awk -F'K' '{print $1/$3*100,  "% used  ->     "  ,$2/$3*100, "% used     " , 100-$2/$3*100, "% free      ",  $3/1024, "M total     ---    堆内存" }'
查看java日志中的问题分析
echo "<<<<<<<<<<<<<< 线程阻塞等待计数: "`less hmilyylimh_error.log | grep "with callerRunsPolicy" | wc -l`",   ""db事务嵌套锁AcquireLock计数: "`less hmilyylimh_error.log | grep "CannotAcquireLockException" | wc -l`",   ""创建事务异常计数: "`less hmilyylimh_error.log | grep "CannotCreateTransactionException" | wc -l`",    ""db连接池溢出计数: "`less hmilyylimh_error.log | grep "more than 'max_user_connections'" | wc -l`",    ""Pool Empty计数: "`less hmilyylimh_error.log | grep "Unable to fetch a connection" | wc -l`" >>>>>>>>>>>>>>"

这是一个用echo、less、grep和wc命令的管道命令,用于统计特定字符串在给定日志文件中出现的次数。

解析命令的步骤如下:

  1. echo "线程阻塞等待计数: ":使用echo命令输出固定文本"线程阻塞等待计数: "。
  2. less hmilyylimh_error.log:使用less命令打开名为hmilyylimh_error.log的日志文件,并将内容传递给下一个命令。
  3. grep "with callerRunsPolicy":使用grep命令筛选包含字符串"with callerRunsPolicy"的行。
  4. wc -l:使用wc命令计算匹配到的行数。
  5. echo ", ""db事务嵌套锁AcquireLock计数: ":使用echo命令输出固定文本", ""db事务嵌套锁AcquireLock计数: "。
  6. 重复步骤2至4,只是将grep命令的参数替换为其他字符串,用于统计不同的计数。
  7. echo " >>>>>>>>>>>>>>":使用echo命令输出固定文本" >>>>>>>>>>>>>>"。

注意,您需要替换xxx_error.log为您实际的日志文件名,以及将每个grep命令的参数替换为您要搜索的特定字符串

查看具体时间点后某个字符串出现的次数

这是一个用awk和grep命令的管道命令,用于从名为xxx.log的日志文件中提取特定时间后包含特定字符串"xxxx"的行数。

cat xxx.log | awk '{if($2>"HH:mm:ss.SSS") print $0}' | grep "xxxx" | wc -l

解析该命令的步骤如下:

  1. cat xxx.log:使用cat命令读取xxx.log文件的内容,并通过管道传递给下一个命令。
  2. awk '{if($2>"HH:mm:ss.SSS") print $0}':使用awk命令,根据每行的第二个字段(假设是时间戳),筛选出时间晚于"HH:mm:ss.SSS"的行,并打印整行内容。请注意,您需要将"HH:mm:ss.SSS"替换为具体的时间,例如"10:30:00.000"。
  3. grep "xxxx":使用grep命令,筛选包含字符串"xxxx"的行。
  4. wc -l:使用wc命令,计算匹配到的行数。

请确保将"HH:mm:ss.SSS"替换为实际的时间戳,并将"xxxx"替换为您要搜索的字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4541.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

行业榜单揭晓:项目管理软件排行榜中的行业翘楚!

在当今复杂的商业环境中&#xff0c;项目管理软件已经成为企业管理不可或缺的工具之一。它们帮助企业组织和协调各个部门的工作&#xff0c;并确保项目能够按时、按预算、按质量要求完成。这就是为什么许多公司都在积极寻找最好的项目管理软件。但是&#xff0c;市场上有许多项…

一个人也可以是【大厂】,三年程序员的生活规划心路分享!

自从工作之后&#xff0c;我就经常思考以下这些问题&#xff1a; 还有多久退休&#xff1f;明天可以退休吗&#xff1f;地球什么时候爆炸&#xff1f;我什么时候可以暴富辞职&#xff1f;我真的需要这份工作吗&#xff1f; 要问是从什么时候开始有这些问题的&#xff0c;大概…

探索嵌入式开发领域:单片机、ARM、Android底层的紧密联系

作为一个曾编写ARM教程和参与Android产品开发的专家&#xff0c;我发现单片机、ARM、嵌入式开发和Android底层开发之间存在紧密的联系。对于那些希望在嵌入式开发领域发展的人来说&#xff0c;了解这些领域的知识至关重要。为了帮助你更好地学习这些内容&#xff0c;我总结了一…

CGAL使用心得 转

CGAL使用心得 转 作者&#xff1a;李浩 首先我说说我研究CGAL的背景&#xff0c;由于&#xff0c;早一阵子&#xff0c;有一个需求&#xff0c;需要求出在一堆二维线中&#xff08;包括直线和弧线&#xff09;&#xff0c;找出所有的最小区域和最大外包。如下图所示。 在这两…

Redis简介

Redis是基于内存&#xff0c;也可以基于磁盘持久化nosql数据库&#xff0c;使用c语言开发。 数据存储结构&#xff1a;key-value 安装环境准备 Redis使用c语言开发&#xff0c;需要使用gcc编译程序进行编译。 1&#xff09; 安装gcc a) 从磁盘镜像中进行安装&#xff1a;&…

结合ace编辑器实现MapboxGL热力图样式在线配置

概述 MapboxGL热力图的配置参数并不多&#xff0c;但是有时候为了或得一个比较好用的热力图配置参数&#xff0c;我们不得不改代码再预览&#xff0c;显得尤为麻烦&#xff0c;为方便配置&#xff0c;实现实时预览&#xff0c;本文使用ace实现了一个热力图样式在线配置页面。 …

MapReduce分布式计算(二)

MapReduce工作流程 原始数据File 1T数据被切分成块存放在HDFS上&#xff0c;每一个块有128M大小 数据块Block hdfs上数据存储的一个单元,同一个文件中块的大小都是相同的 因为数据存储到HDFS上不可变&#xff0c;所以有可能块的数量和集群的计算能力不匹配 我们需要一个动态…

Java面试题3

[TOC]目录 1. spring事务 事务简介 事务在逻辑上是一组操作&#xff0c;要么执行&#xff0c;要不都不执行。主要是针对数据库而言的&#xff0c;比如说 MySQL。 为了保证事务是正确可靠的&#xff0c;在数据库进行写入或者更新操作时&#xff0c;就必须得表现出 ACID 的 4 …

ESP8266-NodeMCU搭建Arduino IDE开发环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、准备工作二、搭建步骤1.打开Arduino IDE 首选项2.打开Arduino IDE的“开发板管理器”3.在Arduino IDE的开发板菜单中找到“NodeMCU开发板”4.设置Arduino IDE的…

mongodb原理

一&#xff1a;MongoDB的优点和缺点 优点 面向文档存储(类JSON数据模式简单而强大)动态查询全索引支持,扩展到内部对象和内嵌数组查询记录分析快速,就地更新高效存储二进制大对象 (比如照片和视频)复制和故障切换支持Auto- Sharding自动分片支持云级扩展性MapReduce 支持复杂…

Redis:redis基于各大实战场景下的基本使用

文章目录 前言String 命令实战1.业务缓存对应redis中的指令伪代码 2.分布式锁对应redis中的指令伪代码 3.限流对应redis中的指令伪代码 List 命令实战1.提醒功能对应Redis中的指令伪代码 2.热点列表对应Redis中的指令伪代码 Hash 命令实战1.用户资料缓存对应redis中的指令伪代码…

Qt实现拖拽功能(支持拖放文件、拖放操作)

目录 拖放Qt程序接受其他程序的拖拽部件/控件之间相互拖放总结 拖放 拖放是在一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式。除了为剪贴板提供支持外,通常它还提供数据移动和复制的功能。 拖放操作包括两个截然不同的动作:拖动和放下。Qt窗口部件可以…