linux pidstat

pidstat是一个监控个别进程在Linux系统上的资源使用情况的工具,它是sysstat工具包的一部分。pidstat可以报告CPU、内存、I/O、上下文切换、线程等多方面的统计信息,对于性能分析和问题诊断非常有用。

基本用法

bash 复制代码
pidstat [选项] [间隔] [次数]
  • 选项 :控制pidstat报告内容的选项。
  • 间隔:两次统计之间的时间间隔,单位为秒。
  • 次数:统计的次数。

如果不指定间隔和次数,pidstat将报告自系统启动以来的统计信息。

常用选项

  • -u:报告CPU使用情况。
  • -r:报告内存使用情况。
  • -d:报告磁盘I/O使用情况。
  • -s :报告堆栈使用情况(仅限于某些版本的pidstat)。
  • -w:报告任务切换情况。
  • -t:报告线程的统计信息。
  • -p PID:指定进程ID(PID)来报告特定进程的统计信息。

输出解释

pidstat的输出根据所选选项而变化,但通常包括以下列:

  • PID:进程ID。
  • %usr:在用户级别运行的CPU时间百分比。
  • %system:在系统(内核)级别运行的CPU时间百分比。
  • %guest:运行虚拟处理器的CPU时间百分比。
  • %CPU:CPU核心编号。
  • CPU:使用的CPU时间百分比。
  • Minflt/s:每秒次缺页错误数。
  • Majflt/s:每秒主缺页错误数。
  • VSZ:虚拟内存大小(KB)。
  • RSS:常驻内存集大小(KB)。
  • kB_rd/s:每秒从磁盘读取的数据量(KB)。
  • kB_wr/s:每秒写入磁盘的数据量(KB)。

示例

1. 报告所有进程的CPU使用情况,每5秒一次,共进行3次统计
bash 复制代码
 pidstat -u 5 3
Linux 5.10.0-136.16.0.x86_64   08/01/2024      _x86_64_        (48 CPU)
07:58:46 AM       PID    %usr %system  %guest    %CPU   CPU  Command
07:58:51 AM       109    0.60    0.20    0.00    0.80    22  log_agent_file
07:58:51 AM       113    0.20    0.00    0.00    0.20    18  log_agent
07:58:51 AM       414    0.20    0.00    0.00    0.20    17  kms_agent
07:58:51 AM       527  100.00   27.74    0.00  100.00     4  java
07:58:51 AM      3916    4.39    0.40    0.00    4.79    31  sg_agent
07:58:51 AM      4409    0.20    0.00    0.00    0.20    25  dw_1006
07:58:51 AM      4417    0.20    0.00    0.00    0.20     5  dw_1003
07:58:51 AM      4633    1.80    0.40    0.00    2.20     8  cplugin
07:58:51 AM      4661    0.20    0.40    0.00    0.60    27  octo-proxy

07:58:51 AM       PID    %usr %system  %guest    %CPU   CPU  Command
07:58:56 AM       109    0.40    0.20    0.00    0.60    19  log_agent_file
07:58:56 AM       113    0.40    0.20    0.00    0.60    19  log_agent
07:58:56 AM       114    0.20    0.00    0.00    0.20    11  agent
07:58:56 AM       527  100.00   31.60    0.00  100.00     4  java
07:58:56 AM      3297    0.20    0.00    0.00    0.20    32  falcon-agent
07:58:56 AM      3916   11.40    0.80    0.00   12.20    31  sg_agent
07:58:56 AM      4417    1.80    3.80    0.00    5.60     5  dw_1003
07:58:56 AM      4661    0.20    0.40    0.00    0.60    26  octo-proxy

07:58:56 AM       PID    %usr %system  %guest    %CPU   CPU  Command
07:59:01 AM       109    0.40    0.20    0.00    0.60    44  log_agent_file
07:59:01 AM       113    0.40    0.20    0.00    0.60    40  log_agent
07:59:01 AM       527  100.00   28.80    0.00  100.00     4  java
07:59:01 AM      3297    0.00    0.20    0.00    0.20    32  falcon-agent
07:59:01 AM      3916   11.20    0.60    0.00   11.80    29  sg_agent
07:59:01 AM      4222    0.00    0.20    0.00    0.20    34  t_800
07:59:01 AM      4412    0.00    0.20    0.00    0.20    28  dw_1008
07:59:01 AM      4417    0.20    0.00    0.00    0.20     5  dw_1003
07:59:01 AM      4661    0.20    0.20    0.00    0.40     4  octo-proxy
07:59:01 AM     29854    0.00    0.20    0.00    0.20    28  pidstat

Average:          PID    %usr %system  %guest    %CPU   CPU  Command
Average:          109    0.47    0.20    0.00    0.67     -  log_agent_file
Average:          113    0.33    0.13    0.00    0.47     -  log_agent
Average:          114    0.07    0.00    0.00    0.07     -  agent
Average:          414    0.07    0.00    0.00    0.07     -  kms_agent
Average:          527  100.00   29.38    0.00  100.00     -  java
Average:         3297    0.07    0.07    0.00    0.13     -  falcon-agent
Average:         3916    8.99    0.60    0.00    9.59     -  sg_agent
Average:         4222    0.00    0.07    0.00    0.07     -  t_800
Average:         4409    0.07    0.00    0.00    0.07     -  dw_1006
Average:         4412    0.00    0.07    0.00    0.07     -  dw_1008
Average:         4417    0.73    1.27    0.00    2.00     -  dw_1003
Average:         4633    0.60    0.13    0.00    0.73     -  cplugin
Average:         4661    0.20    0.33    0.00    0.53     -  octo-proxy
Average:        29854    0.00    0.07    0.00    0.07     -  pidstat
2. 报告特定进程的CPU和内存使用情况
bash 复制代码
pidstat -u -r -p [PID] 1
Linux 5.10.0-136.16.0.x86_64   08/01/2024      _x86_64_        (48 CPU)
08:01:07 AM       PID    %usr %system  %guest    %CPU   CPU  Command
08:01:08 AM       527  100.00   31.00    0.00  100.00     4  java

08:01:07 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
08:01:08 AM       527    215.00      1.00 31826336 18099264  71.92  java

08:01:08 AM       PID    %usr %system  %guest    %CPU   CPU  Command
08:01:09 AM       527  100.00   35.00    0.00  100.00     4  java

08:01:08 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
08:01:09 AM       527    304.00      0.00 31826336 18099344  71.92  java

08:01:09 AM       PID    %usr %system  %guest    %CPU   CPU  Command
08:01:10 AM       527  100.00   29.00    0.00  100.00     4  java

08:01:09 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
08:01:10 AM       527    200.00      0.00 31826336 18099340  71.92  java

[PID]替换为你想要监控的进程的PID。

3. 报告所有线程的CPU使用情况
bash 复制代码
pidstat -t -u 1
Linux 5.10.0-136.16.0.x86_64   08/01/2024      _x86_64_        (48 CPU)
08:01:54 AM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
08:01:55 AM       109         -    0.93    0.00    0.00    0.93    43  log_agent_file
08:01:55 AM         -       306    0.93    0.00    0.00    0.93    28  |__log_agent
08:01:55 AM         -       496    0.93    0.00    0.00    0.93    41  |__kms_agent
08:01:55 AM       527         -  100.00   27.10    0.00  100.00     4  java
08:01:55 AM         -      1568    0.00    0.93    0.00    0.93    21  |__java
08:01:55 AM         -      1579    0.93    0.93    0.00    1.87    16  |__java
08:01:55 AM         -      1582    0.93    0.00    0.00    0.93    44  |__java
08:01:55 AM         -      1583    0.93    0.00    0.00    0.93    40  |__java
08:01:55 AM         -      1585    0.93    0.00    0.00    0.93    23  |__java
bash 复制代码
$ pidstat
Linux 5.10.0-136.16.0.x86_64   08/01/2024      _x86_64_        (48 CPU)

08:04:58 AM       PID    %usr %system  %guest    %CPU   CPU  Command
08:04:58 AM         1    0.00    0.00    0.00    0.00    18  container-init
08:04:58 AM        98    0.00    0.00    0.00    0.00    24  svscan
08:04:58 AM       109    0.32    0.25    0.00    0.57    37  log_agent_file
08:04:58 AM       113    0.30    0.13    0.00    0.43    46  log_agent
08:04:58 AM       114    0.00    0.00    0.00    0.00    11  agent
08:04:58 AM       207    0.00    0.00    0.00    0.00    37  one-agent
08:04:58 AM       226    0.00    0.00    0.00    0.00     7  rsyslogd
08:04:58 AM       411    0.04    0.00    0.00    0.04     8  supervisord
08:04:58 AM       414    0.06    0.03    0.00    0.09    17  kms_agent
08:04:58 AM       504    0.00    0.00    0.00    0.00    12  container-agent
08:04:58 AM       527  100.00   31.65    0.00  100.00     4  java
08:04:58 AM      1183    0.01    0.00    0.00    0.01    37  upgrader-agent
08:04:58 AM      3297    0.26    0.14    0.00    0.41    32  falcon-agent
08:04:58 AM      3916    9.10    0.72    0.00    9.82    26  sg_agent
08:04:58 AM      4085    0.00    0.00    0.00    0.00     7  crane_agent_par
08:04:58 AM      4221    0.02    0.01    0.00    0.04    35  dw_1001
08:04:58 AM      4222    0.01    0.03    0.00    0.04    27  t_800
08:04:58 AM      4288    0.04    0.01    0.00    0.05    20  jumper-agent
08:04:58 AM      4350    0.00    0.00    0.00    0.01     9  nscd
08:04:58 AM      4398    0.00    0.00    0.00    0.00    13  crond
08:04:58 AM      4408    0.06    0.03    0.00    0.09    16  dw_1011
08:04:58 AM      4409    0.03    0.03    0.00    0.06    22  dw_1006
08:04:58 AM      4410    0.02    0.01    0.00    0.03    21  dw_1002
08:04:58 AM      4411    0.02    0.02    0.00    0.03    13  dw_1004
08:04:58 AM      4412    0.05    0.04    0.00    0.08    28  dw_1008
08:04:58 AM      4417    0.50    0.85    0.00    1.35     5  dw_1003
08:04:58 AM      4426    0.06    0.04    0.00    0.10    40  dw_1013
08:04:58 AM      4564    0.00    0.00    0.00    0.00    39  go-ark
08:04:58 AM      4633    0.14    0.04    0.00    0.17    32  cplugin
08:04:58 AM      4661    0.23    0.29    0.00    0.53     5  octo-proxy
08:04:58 AM      4710    0.00    0.00    0.00    0.00    31  pamela-agent
08:04:58 AM     29268    0.00    0.00    0.00    0.00    21  sshd
08:04:58 AM     29288    0.00    0.00    0.00    0.00    21  sshd
08:04:58 AM     29289    0.00    0.00    0.00    0.00    17  bash
08:04:58 AM     29889    0.00    0.00    0.00    0.00    27  sshd
08:04:58 AM     29910    0.00    0.00    0.00    0.00    40  sshd
08:04:58 AM     29911    0.00    0.00    0.00    0.00    14  bash
4. 监控锁竞争

pidstat -w输出结果中的cswch/s是让步式上下文切换。重点需要注意的是,该值并不包括所有的上下文切换(像Solaris mpstat输出的那样 )。此外,pidstat -w报告的是每秒而不是每个测量间隔的让步式上下文切换。因此,让步式上下文切换浪费的时钟周期,可以由pidstat -w的让步式上下文切换数除以虚拟处理器的数日而得出。请记住,pidstat -w是所有虚拟处理器的让步式上下文切换。让步式上下文切换数乘以80 000,除以CPU每秒的时钟周期,可以得出让步式上下文切换所耗费的CPU时钟周期百分比。下面是pidstat-w每5秒监控进程id为9391的Java应用。

让步式上下文切换是指执行线程主动释放CPU,抢占式上下文切换是指线程因为分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占。

bash 复制代码
$ pidstat -w -I -p 9391
Linux 2.6.24-server
08:08:55 AM       PID   cswch/s nvcswch/s  Command
08:08:55 AM       9391  3645    322         java
08:08:55 AM       9391  3512    292         java
08:08:55 AM       9391  3499    310         java

下面估算上下文切换所浪费的时钟周期。处理器为3.0GHz双核Intel CPU,pidstat -w显示系统每秒大约发生3500个上下文切换。因此,每个虚拟处理器的上下文切换为3500/2=1750,耗费的时钟周期为1750x80 000=140 000 000。3GHz CPU每秒的时钟周期数为3 000 000 000。因此上下文切换所浪费的时钟周期为140 000000/3 000 000000=4.7%。再次应用一般性准则( 即让步时钟周期占用3%~5%或更多时钟周期 ),说明Java应用正面临锁竞争。
~参考:《Java性能优化权威指南》~

5. 监控内存使用情况

通过监控进程的内存使用情况,pidstat可以帮助识别内存泄漏或其他内存相关问题。这对于优化应用程序的内存使用和提高系统的整体性能非常重要。

使用pidstat分析内存涉及到监控进程的内存使用情况,包括进程的常驻集大小(RSS)、虚拟内存大小(VSZ)、以及页面错误等。以下是如何使用pidstat来分析内存使用情况的步骤:

pidstat-r选项可以用来报告进程的内存使用情况。以下是一些常用的命令示例:

  • 监控所有进程的内存使用情况
bash 复制代码
pidstat -r
Linux 5.10.0-136.16.0.x86_64   08/01/2024      _x86_64_        (48 CPU)
08:24:59 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
08:24:59 AM         1      0.04      0.00  705764   4064   0.02  container-init
08:24:59 AM        92      0.00      0.00  108248   2920   0.01  svscanboot
08:24:59 AM        98      0.01      0.00    4168   1088   0.00  svscan
08:24:59 AM        99      0.00      0.00    3984    412   0.00  readproctitle
08:24:59 AM       100      0.00      0.00    3996    412   0.00  supervise
08:24:59 AM       101      0.00      0.00    3996    504   0.00  supervise
08:24:59 AM       102      0.00      0.00    4128    412   0.00  supervise
08:24:59 AM       107      0.00      0.00    3996    404   0.00  supervise
08:24:59 AM       108      0.00      0.00    4128    444   0.00  supervise
08:24:59 AM       109      2.62      0.00 1086320  13004   0.05  log_agent_file
08:24:59 AM       113     13.60      0.00 2093992  18876   0.08  log_agent
08:24:59 AM       114      0.05      0.00  397076  16508   0.07  agent
08:24:59 AM       207      0.08      0.00  718092  14656   0.06  one-agent
08:24:59 AM       226      0.00      0.00  171396   2712   0.01  rsyslogd
08:24:59 AM       411      0.15      0.00  201668  13492   0.05  supervisord
08:24:59 AM       414      0.89      0.00 1962844  27216   0.11  kms_agent
08:24:59 AM       504      0.21      0.00 1055120  14156   0.06  container-agent
08:24:59 AM       527  15763.87      0.29 31826336 18211552  72.37  java
  • 监控特定进程的内存使用情况
bash 复制代码
pidstat -r -p <PID>

<PID>替换为你想要监控的进程ID。

解读输出
pidstat的内存监控输出主要包括以下几个字段:

  • Minflt/s:每秒次缺页错误的数量。次缺页错误发生时,所需页面已经在内存中,但需要从其他位置加载。
  • Majflt/s:每秒主缺页错误的数量。主缺页错误发生时,所需页面不在内存中,需要从磁盘加载。
  • VSZ:虚拟内存大小,以KB为单位。
  • RSS:常驻集大小,以KB为单位。这是进程实际使用的物理内存量,不包括交换出去的部分。
  • %MEM:进程使用的物理内存百分比。

分析和优化

  • Majflt/s :如果观察到Majflt/s值较高,这可能意味着进程频繁从磁盘读取数据到内存,可能是内存不足导致的。考虑增加物理内存或优化程序以减少内存使用。
  • RSSVSZ :如果RSSVSZ值异常高,可能表明内存泄漏或进程占用过多内存。需要进一步分析程序代码,查找并修复内存泄漏或不必要的内存占用。
6. 跟踪磁盘I/O

pidstat能够报告进程的磁盘读写活动,这对于诊断I/O瓶颈和优化磁盘访问性能非常有用。了解哪些进程频繁访问磁盘可以帮助你做出相应的优化措施。

使用pidstat跟踪磁盘I/O涉及到监控进程的磁盘读写活动,这对于诊断系统性能瓶颈和优化磁盘使用非常有用。pidstat通过-d选项提供了这一功能。以下是如何使用pidstat来跟踪磁盘I/O的步骤:

1. 使用-d选项监控磁盘I/O

启动pidstat并使用-d选项来报告磁盘I/O统计信息。你可以指定一个时间间隔(以秒为单位)来连续监控磁盘I/O活动。

bash 复制代码
pidstat -d [间隔] [次数]
pidstat -d 5 1
Linux 5.10.0-136.16.0.x86_64    08/01/2024      _x86_64_        (48 CPU)

08:37:41 AM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command

Average:          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
  • 间隔:两次统计之间的时间间隔,单位为秒。
  • 次数 :统计的次数。如果省略此参数,pidstat将持续报告直到被中断。

2. 监控特定进程的磁盘I/O

如果你对特定进程的磁盘I/O活动感兴趣,可以使用-p选项指定进程ID(PID):

bash 复制代码
pidstat -d -p <PID> [间隔] [次数]

<PID>替换为你想要监控的进程的PID。

3. 解读输出

pidstat的磁盘I/O监控输出主要包括以下几个字段:

  • kB_rd/s:每秒从磁盘读取的数据量(以KB为单位)。
  • kB_wr/s:每秒写入磁盘的数据量(以KB为单位)。
  • kB_ccwr/s:每秒取消写入磁盘的数据量(以KB为单位)。这通常涉及到重写已缓存的数据。

4. 分析和优化

  • 高磁盘读写活动 :如果观察到某个进程有高磁盘读写活动(kB_rd/skB_wr/s值较高),这可能是性能瓶颈的迹象。需要进一步分析该进程的行为,看是否可以通过优化算法、减少不必要的I/O操作、使用缓存等方式来降低对磁盘的依赖。
  • 磁盘I/O与系统性能:持续的高磁盘I/O可能会影响系统的整体性能,特别是当磁盘速度成为限制因素时。考虑使用更快的存储解决方案,如SSD,或者优化应用程序以减少对磁盘的需求。

通过定期监控和分析磁盘I/O活动,可以帮助及时发现和解决磁盘I/O相关的性能问题,优化系统和应用程序的性能。

7. 监控线程性能

对于多线程应用程序,pidstat可以提供每个线程的性能数据,包括CPU使用率、内存使用等。这有助于开发者理解多线程应用程序的行为,并对线程之间的同步和调度进行优化。

  1. 启用线程监控 :使用-t选项可以让pidstat报告线程级别的统计信息。例如,pidstat -t 1会每秒报告所有线程的性能统计信息。
bash 复制代码
 pidstat -t 3
Linux 4.18.0-147.x86_64    08/02/2024      _x86_64_        (128 CPU)

08:12:20 AM      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
08:12:23 AM        78         -    0.32    0.00    0.00    0.32    41  svscan
08:12:23 AM        96         -    0.00    0.32    0.00    0.32   118  log_agent_file
08:12:23 AM       646         -    3.56    0.65    0.00    4.21    41  java
08:12:23 AM         -       857    0.32    0.00    0.00    0.32    30  |__java
08:12:23 AM         -      2332    0.32    0.00    0.00    0.32    85  |__java
08:12:23 AM         -      2406    0.32    0.00    0.00    0.32    80  |__java
08:12:23 AM         -      2411    0.32    0.00    0.00    0.32     5  |__java
08:12:23 AM         -      2500    0.32    0.00    0.00    0.32    66  |__java
08:12:23 AM         -      2585    0.32    0.00    0.00    0.32    92  |__java
08:12:23 AM         -      2594    0.32    0.00    0.00    0.32    24  |__java
08:12:23 AM         -      2908    0.32    0.00    0.00    0.32    95  |__java
08:12:23 AM         -      4048    0.32    0.00    0.00    0.32    22  |__java
08:12:23 AM      5121         -    0.32    0.00    0.00    0.32   123  t_800
08:12:23 AM      5406         -    0.32    0.00    0.00    0.32    80  dw_1006
08:12:23 AM         -      5417    0.00    0.32    0.00    0.32    15  |__dw_1006
08:12:23 AM      5522         -    0.32    0.32    0.00    0.65   116  falcon-agent
08:12:23 AM         -      5535    0.00    0.32    0.00    0.32   107  |__falcon-agent
08:12:23 AM      5641         -    1.29    0.32    0.00    1.62    84  sg_agent
08:12:23 AM         -      5641    0.00    0.32    0.00    0.32    84  |__sg_agent
08:12:23 AM         -      5656    0.00    0.32    0.00    0.32    26  |__sg_agent
08:12:23 AM         -      5702    0.32    0.00    0.00    0.32    86  |__sg_agent
08:12:23 AM         -      5703    0.32    0.00    0.00    0.32    86  |__sg_agent
08:12:23 AM     40308         -    0.97    1.62    0.00    2.59    68  pidstat
08:12:23 AM         -     40308    0.97    1.62    0.00    2.59    68  |__pidstat
  1. 指定进程 :如果只对某个特定进程的线程感兴趣,可以使用-p选项指定进程ID。例如,pidstat -t -p <PID> 1会监控指定PID进程的所有线程。

  2. 查看CPU使用率pidstat输出中的%CPU列显示了线程的CPU使用率,这对于识别CPU密集型线程非常有用。

  3. 查看内存使用情况 :虽然pidstat直接不报告内存使用情况,但可以结合其他工具(如pmap)来分析特定线程的内存使用。

分析和优化

    1. 识别高CPU使用率的线程 :通过pidstat报告,可以识别出CPU使用率异常高的线程。这些线程可能是性能瓶颈的原因。针对这些线程的代码进行优化,比如改进算法,减少不必要的计算,可以提高整体性能。
    1. 理解线程行为:通过观察线程的CPU使用模式(比如,是否有周期性的峰值),可以对线程的行为有更深入的理解。这有助于调整线程的工作模式,比如调整线程的执行频率或是改变线程的优先级。
    1. 并发和锁优化:如果多个线程的CPU使用率都不高,但整体CPU使用率很高,可能是因为线程间存在大量的锁争用或并发问题。这时可以考虑优化锁的使用,比如使用更细粒度的锁,或者使用无锁编程技术。
    1. 结合其他工具pidstat提供的信息有限,结合其他工具(如perf等)可以进行更深入的性能分析。例如,perf可以用来分析热点函数
    1. 代码级优化:基于上述分析,对代码进行优化。这可能包括算法优化、减少不必要的系统调用、优化数据结构等。
8. 上下文切换分析

过多的上下文切换可能会降低系统性能。pidstat可以报告进程的上下文切换次数,帮助识别和优化导致频繁上下文切换的问题。

上下文切换是指CPU从执行一个进程(或线程)切换到执行另一个进程(或线程)的过程。过多的上下文切换可能会导致CPU资源浪费在切换过程上,而不是执行实际的工作,从而影响系统性能。

如何进行上下文切换分析

使用pidstat进行上下文切换分析的命令如下:

bash 复制代码
pidstat -w [interval] [times]
pidstat -w 5 2
01:35:15 PM       PID   cswch/s nvcswch/s  Command
01:35:20 PM        75      0.20      0.00  svscan
01:35:20 PM        86      1.00      0.00  log_agent_file
01:35:20 PM        90      2.40      0.00  log_agent
01:35:20 PM       416      1.00      0.00  supervisord
01:35:20 PM      4483      0.20      0.00  crane_agent_par
01:35:20 PM      4586      0.60      0.00  cplugin
01:35:20 PM      4614     10.38      0.00  octo-proxy
01:35:20 PM      4793     71.46      0.20  sg_agent
01:35:20 PM     11411      0.20      0.00  pidstat

01:35:20 PM       PID   cswch/s nvcswch/s  Command
01:35:25 PM        75      0.20      0.00  svscan
01:35:25 PM        86      1.00      0.00  log_agent_file
01:35:25 PM        90      2.40      0.00  log_agent
01:35:25 PM       416      1.00      0.00  supervisord
01:35:25 PM      4483      0.20      0.00  crane_agent_par
01:35:25 PM      4614     10.20      0.00  octo-proxy
01:35:25 PM      4793     71.00      0.00  sg_agent
01:35:25 PM     11388      0.20      0.00  sshd
01:35:25 PM     11411      0.20      0.00  pidstat
  • -w 选项告诉pidstat报告上下文切换数据。
  • [interval] 是采样间隔,单位是秒。
  • [times] 是采样次数。

这个命令会显示每个进程的自愿上下文切换(cswch/s)和非自愿上下文切换(nvcswch/s):

  • 自愿上下文切换cswch/s):进程主动放弃CPU,通常是因为等待I/O操作完成或等待某些资源。
  • 非自愿上下文切换nvcswch/s):进程被迫放弃CPU,通常是因为时间片用完或更高优先级的进程需要运行。
什么场景代表有问题
  • 上下文切换次数异常高:如果某个进程的自愿或非自愿上下文切换次数远高于其他进程,这可能是性能问题的指标。特别是非自愿上下文切换,它通常表示CPU竞争激烈。
  • 系统整体上下文切换过高:如果系统整体的上下文切换次数非常高,这可能表示系统过载,CPU花费大量时间在进程间切换,而不是执行实际的工作。
如何优化
  1. 减少进程数和线程数:如果可能,减少运行的进程数和线程数。过多的进程和线程会增加调度开销和上下文切换。

  2. 优化程序逻辑:对于自愿上下文切换较多的进程,检查程序逻辑,减少不必要的I/O操作,优化等待资源的方式。

  3. 调整进程优先级:对于关键进程,可以考虑提高其优先级,使其更少被抢占。

  4. 使用锁和同步机制:合理使用锁和同步机制,减少因资源竞争导致的非自愿上下文切换。

  5. 调整内核调度器参数:在某些情况下,调整内核调度器的参数(如时间片长度)可能有助于减少上下文切换。

  6. 使用CPU亲和性:将进程或线程绑定到特定的CPU核心,减少在多个核心之间的切换。

通过上述方法,可以有效地减少不必要的上下文切换,提高系统性能。不过,需要注意的是,优化过程中应该避免过度优化,因为上下文切换本身是操作系统正常调度的一部分。

6. 性能基准测试

在进行系统升级、配置更改或部署新应用程序之前和之后,使用pidstat收集性能数据可以帮助评估更改对系统性能的影响。

虽然pidstat本身不是一个性能基准测试工具,但它可以在进行性能基准测试时用来收集和分析进程级别的性能数据。以下是如何使用pidstat进行性能基准测试的一般步骤:

步骤1:确定测试目标

在开始之前,明确你想要测试的性能指标,比如CPU使用率、内存使用量、I/O操作等。这将帮助你决定使用pidstat的哪些选项。

步骤2:准备测试环境

确保测试环境稳定且尽可能接近生产环境。这包括关闭不必要的服务和进程,以减少对测试结果的干扰。

步骤3:运行pidstat开始收集数据

在启动基准测试之前,开始运行pidstat来监控相关进程的性能。你可以使用不同的选项来监控不同类型的性能数据:

  • 监控CPU使用情况:pidstat -u [interval] [times]
  • 监控内存使用情况:pidstat -r [interval] [times]
  • 监控I/O使用情况:pidstat -d [interval] [times]
  • 监控上下文切换:pidstat -w [interval] [times]

其中[interval]是采样间隔(秒),[times]是采样次数。如果不指定进程ID,pidstat将报告所有进程的数据。你也可以使用-p选项指定特定进程的PID。

步骤4:运行性能基准测试

pidstat收集数据的同时,运行你的性能基准测试。确保测试覆盖了所有你关心的性能场景。

步骤5:分析结果

测试完成后,分析pidstat收集的数据,关注以下几点:

  • CPU使用率:高CPU使用率可能表明CPU瓶颈。
  • 内存使用量:过高的内存使用量可能导致交换(swapping),影响性能。
  • I/O等待:高I/O等待时间可能表明磁盘I/O瓶颈。
  • 上下文切换:频繁的上下文切换可能表明线程竞争或CPU过载。
步骤6:优化和调整

根据分析结果,对应用或系统进行优化。这可能包括代码优化、系统配置调整、硬件升级等。

步骤7:重复测试

在进行了优化后,重复上述测试过程,以验证优化措施的效果。

通过这种方式,pidstat可以作为性能基准测试的辅助工具,帮助你收集和分析进程级别的性能数据,从而更好地理解和优化应用的性能。

7. 长期性能监控

通过定期运行pidstat并记录输出,可以建立长期的性能日志。这些日志对于理解系统性能随时间的变化、预测未来的系统需求以及诊断长期出现的性能问题非常有价值。

总结

总之,pidstat是一个强大的工具,适用于从日常系统维护到深入的性能分析和优化的多种场景。可以帮助你深入了解系统中各个进程的性能表现。

相关推荐
LKAI.5 分钟前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
gywl2 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
日记跟新中3 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
码农君莫笑3 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
BUG 4043 小时前
Linux——Shell
linux·运维·服务器
大霞上仙4 小时前
Linux 多命令执行
linux·运维·服务器
晨欣4 小时前
Kibana:LINUX_X86_64 和 DEB_X86_64两种可选下载方式的区别
linux·运维·服务器
AI青年志4 小时前
【服务器】linux服务器管理员查看用户使用内存情况
linux·运维·服务器
dessler5 小时前
Docker-run命令详细讲解
linux·运维·后端·docker
PyAIGCMaster5 小时前
ubuntu装P104驱动
linux·运维·ubuntu