Linux - 系统性能监控

2023-11-13

重点讨论一些有助于监视系统整体性能的工具。当理解了工作负荷的系统整体性能特征之后,还可以使用这组工具标识出哪些特定进程是整体工作负荷的性能瓶颈。在许多情况下,系统监视工具有助于推动系统调优工作,使得关键的性能瓶颈得到极大减少或消除;另一些情况下,这些工具只是准确识别出为了改进工作负荷整体性能和吞吐率,有哪些应用或进程需要调优、重新配置,或者在极端情况下进行算法修改。

本章将着重分析许多可以为下列内容提供有用信息的工具:

  • 整体系统CPU利用率。
  • 内存利用率。
  • 磁盘I/O的利用率和延迟。
  • 网络利用率。

1、CPU利用率

在对系统的方法化分析中,首要且最基本的工具之一常常是对系统的CPU利用率进行简单测量。Linux以及大多数基于UNIX的操作系统都提供了一条命令来显示系统的平均负荷(load average)。

$ uptime
17:37:30 up 3 days, 17:06,  7 users,  load average: 1.13, 1.23, 1.15

具体地讲,平均负荷值代表了在1min、5min和15min内可以运行的任务平均数量。可运行的任务包括当前正在运行的任务以及虽然可以运行但正在等待某个处理器空闲的任务。本例中的系统只有一个CPU,它可以通过查看/proc/cpu的内容来确定。

$ cat /proc/cpu
processor               : 0
vendor_id               : GenuineIntel
cpu family              : 6
model                        : 8
model name                  : Pentium III (Coppermine)
stepping                 : 6
cpu MHz                  : 647.195
cache size              : 256 KB
fdiv_bug             : no
hlt_bug          : no
f00f_bug         : no
coma_bug         : no
fpu              : yes
fpu_exception   : yes
cpuid level     : 2
wp               : yes
flags            : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr sse
bogomips         : 1291.05

在本例中,对于单处理器只存在一项,因此平均情况下,处理器要执行的工作会稍多于它的处理能力。在较高层次上,这意味着机器需要执行的工作多于它的处理能力。

注意:若在双CPU的机器上uptime命令显示的负荷平均值小于2.00的话,这表明处理器仍拥有额外的空闲周期。在4个CPU的机器上如果负荷平均值小于4.00的话也表明同样的情况,如此等等。然而,负荷平均值单独并不能说明全部问题。

为了更深入地探究处理器的使用情况,下面介绍的3种工具可以提供许多关于CPU利用情况的不同理解:vmstat、iostat和top。这些工具各自关注系统监视的不同方面,但都可获得关于处理器当前使用情况的不同视图。

vmstat

vmstat是一个实时性能监视工具。该工具提供了有助于发现系统异常活动的数据,例如会降低系统性能的过多页面错误或上下文切换次数。这些数据的显示频率可由用户指定。vmstat输出样本如下所示:

procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r   b   swpd  free   buff  cache   si   so    bi    bo   in    cs  us sy id wa
18  8    0 5626196   3008 122788    0    0 330403   454 2575  4090 91  8  1  0
18 15    0 5625132   3008 122828    0    0 328767   322 2544  4264 91  8  0  0
17 12    0 5622004   3008 122828    0    0 327956   130 2406  3998 92  8  0  0
22  2    0 5621644   3008 122828    0    0 327892   689 2445  4077 92  8  0  0
23  5    0 5621616   3008 122868    0    0 323171   407 2339  4037 92  8  1  0
21 14    0 5621868   3008 122868    0    0 323663    23 2418  4160 91  9  0  0
22 10    0 5625216   3008 122868    0    0 328828   153 2934  4518 90  9  1  0

vmstat提供以下信息:

  • procs部分提供了在生成报告时正在运行的进程数目(r)以及被阻塞的进程数目(b)。可以利用这些信息来检查运行中以及阻塞进程的数目是否与预期值相符。如果与预期不符的话,可以检查:应用和内核的参数、系统调度器和I/O调度器、进程在可用处理器之间的分布等。
  • memory部分提供了换出内存(swpd)、空闲内存(free)、I/O数据结构的缓冲区缓存(buff),以及从磁盘读取文件的内存缓存(cache)的容量,单位为KB。swpd的取值反映了kswapd的活动情况。
  • swap部分提供了从磁盘上换入的内存容量(si)以及换出到磁盘上的内存量(so),单位为KB/s。so反映了当数据被换出至交换区时kswapd的活动情况,而si则反映了当页面被换回到物理内存时发生页面错误的情况。
  • io部分提供了从设备读入的块数(bi)以及写出到设备上的块数(bo),单位为KB/s。当运行I/O密集的应用时,应特别注意这两个部分的值。
  • system部分提供了每秒的中断数目(in)和上下文切换数目(cs)。
  • cpu部分提供了用户(us)、系统(sy)、真正空闲(id)以及等待I/O完成(wa)在CPU总时间中所占的百分比。CPU利用率也许是最常用的量度。若wa值过大,则应该检查I/O子系统,例如,可以断定需要更多的I/O控制器和磁盘以便减少I/O等待时间。

对于I/O活动密集的工作负荷,可以通过监视bi和bo来获取传输速率,监视in来获取中断速率。通过监视swpd、si和so可以查看系统是否正在进行交换活动。如果发生交换,则可以检查交换速率。最常见的量度或许是CPU利用率以及对us、sy、id和wa的监视。若wa取值很大,就需要检查I/O子系统。可能会得出结论:需要添加更多的I/O控制器和磁盘以减少I/O等待时间。

与uptime类似,如果在没有选项的情况下运行vmstat工具,会提供系统的单个快照。如果运行uptime之后再执行vmstat,则可以获得关于系统繁忙程度的快照以及关于处理器针对用户、系统、空闲以及等待I/O 的时间百分比。另外,vmstat还对可运行进程的数目加以即时计数。注意uptime提供了可运行进程数目在3个时间范围(1min、5min和15min)内的另一种视图。因此,如果uptime给出的平均负荷值在任何时间范围内都大于1,则vmstat报告的可运行任务数量也应该接近1。

vmstat能够以重复的时间间隔定期提供信息,因此可通过以下命令获得动态的系统视图。

$ vmstat 5 10

上述命令的含义是每5s输出vmstat信息,共执行10次。另外,若根据uptime的输出结果,平均负荷值在过去的1/5/10min内一直为1,则该命令的输出结果通常应该在每个输出行均显示一项可运行的任务。在vmstat的输出信息中出现峰值为5、7甚至20的情况并不奇怪。因为负荷平均值是一种计算平均值而不是即时快照。这两个视图对于系统性能分析工作而言各自有其优点。

在另一个场景中,假定负荷平均值超过1,甚至可能比已建立的基线平均高出一个百分点。另外,vmstat显示总有一两个进程是可运行的,但在一段扩展的时间范围内用户时间的百分比将近100%。可能需要其他工具例如ps(1)或top(1)来发现有哪个或哪些进程正在占用着100%的CPU时间。ps(1)提供了所有当前存在的进程列表,或基于命令选项给出选定的进程子集。top(1)(或gtop(1))为最活跃的进程提供了持续更新的视图,其中最活跃的进程可定义为当前占用CPU时间最多的进程。这些数据可能有助于识别出在系统中没有执行有效工作的失控进程。如果vmstat(1)已报告这些进程主要在用户空间中运行,则系统管理员可能希望将调试器(例如gdb(1))连接至该进程,并使用断点、跟踪执行或其他调试方法来理解该应用当前执行的工作。如果vmstat已报告大部分时间都作为“系统”时间而消耗,则可以使用其他工具例如strace(1)来确定正在执行哪些系统调用;若vmstat(1)报告指出相当大比例的时间都用于等待I/O操作完成,则可以使用sar(1)等工具来查看正在使用中的设备,并可能提供一些诸如哪些应用或文件系统处于使用中、系统是否正在执行交换或页面调度等信息。

vmstat(1)给出了一些关于系统当前状态的简单信息。本节主要讨论与CPU利用率有关的内容。但vmstat(1)也提供了关于内存利用情况、基本的交换活动以及I/O活动等信息。本章后面各节详细分析这些内容。

top与gtop工具

top和gtop工具非常有助于对导致生成vmstat或uptime所显示的高层信息的任务和进程加以理解。它们可以显示哪些进程是活跃的以及哪些进程消耗的处理时间或内存最多。

top命令对于所有正在运行的进程和系统载荷提供不断更新的概览信息,包括CPU负荷、内存使用以及每个进程的内存使用情况,具体如下面的快照内容所述。注意top也提供了负荷平均值的快照,这非常类似于uptime(1)的做法;然而,top也提供了关于已被创建但当前正在休眠的进程数量以及正在运行的进程数量的分类汇总信息。“休眠”任务是那些处于被阻塞并等待某项活动的任务,例如用户对键盘的一次按键、来自管道或socket的数据、来自另一台主机(例如,等待别人发出内容请求的Web服务器)的请求等。top(1)还单独显示了每个处理器的负荷平均值,这有助于识别在调度任务过程中的任何不均衡性。默认状态下,top的输出被经常地刷新,且把任务基于CPU占用时间的百分比排序。当然也可能存在着其他排序选项,例如CPU累加消耗量或者内存消耗百分比。

4:52pm  up  5:08,  3 users,  load average: 2.77, 5.81, 3.15
37 processes: 36 sleeping, 1 running, 0 zombie, 0 stopped
CPU0 states:  5.1% user, 53.1% system,  0.0% nice, 41.1% idle
CPU1 states:  5.0% user, 52.4% system,  0.0% nice, 41.4% idle
Mem:   511480K av,   43036K used,  468444K free,       0K shrd,    2196K
Swap:  263992K av,       0K used,  263992K free                 21432K

  PID USER   PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM  TIME COMMAND
 1026 root    2   0   488  488   372  S    1.1  0.0   0:00 chat_s
 7490 root   11   0  1012 1012   816  R    0.5  0.1   0:00 top
    3 root   19  19     0    0     0  SWN  0.3  0.0   0:00 ksoftirqd_C
    4 root   19  19     0    0     0  SWN  0.1  0.0   0:00 ksoftirqd_C
    1 root    9   0   536  536   468  S    0.0  0.1   0:04 init
    2 root    9   0     0    0     0  SW   0.0  0.0   0:00 keventd
    5 root    9   0     0    0     0  SW   0.0  0.0   0:00 kswapd
    6 root    9   0     0    0     0  SW   0.0  0.0   0:00 bdflush
    7 root    9   0     0    0     0  SW   0.0  0.0   0:00 kupdated
    9 root    9   0     0    0     0  SW   0.0  0.0   0:00 scsi_eh_0
   10 root    9   0     0    0     0  SW   0.0  0.0   0:00 khubd
  331 root    9   0   844  844   712  S    0.0  0.1   0:00 syslogd
  341 root    9   0  1236 1236   464  S    0.0  0.2   0:00 klogd
  356 rpc     9   0   628  628   536  S    0.0  0.1   0:00 portmap

 top的输出结果中包括以下信息。

  • 第1行显示系统正常运行时间,包括当前时间、系统自从上次重启后已运行的时间长度、当前用户数量,以及3个用于表示在先前的1min、5min和15min内准备运行的平均处理器数目的平均负荷值。
  • 第2行给出进程的统计信息,包括在top输出结果的上次更新之际正在运行的进程总数。这一行还显示睡眠中的进程、运行中的进程、僵尸进程以及已停止进程的数目。
  • 第3行和第4行显示各个CPU的统计信息,包括用户进程、系统进程、niced进程以及空闲进程所占用的CPU时间百分比。
  • 第5行提供了内存统计信息,包括内存总量、已用内存量、空闲内存量、不同进程共享的内存量,以及用作缓冲区的内存量。
  • 第6行显示了虚存或交换活动的统计信息,包括交换空间总量、已用的交换空间大小、空闲的交换空间大小以及缓存的交换空间大小。

其余各行显示了具体进程的统计信息。一些更有用的top参数如下所示:

  • d  输出数据的更新延迟。
  • p  只显示指定进程的信息。最多可指定20个进程。
  • S  显示进程及其子进程所占用时间的汇总信息,还给出进程的停工时间。
  • I  不报告空闲进程的信息。
  • H  显示进程的所有线程信息。
  • N  生成报告的次数。

top还提供了一种动态模式修改所报告的信息。按下F键可以激活动态模式。再按下J键,就可以添加一个新列来显示某个当前执行的进程最近使用的CPU时间。这种额外信息对于理解SMP系统中的进程特别有用。

sar

sar是sysstat工具包的组成部分。它收集并报告操作系统中广泛的系统活动,包括CPU利用率、上下文切换和中断速率、页换入和页换出速率、共享内存使用情况、缓冲区使用情况以及网络使用情况。sar(1)工具很有用,它不断地收集系统活动信息并将其记录到一组日志文件中,从而有可能在报告性能衰退事件之前以及在该事件之后评估性能问题。sar常常用于确定事件的时间,也可用于标识特定的系统行为变化。sar可以使用更短的时间间隔或固定数目的时间间隔来输出信息,这非常类似于vmstat。基于数量和时间间隔参数的取值,sar工具以指定的时间间隔(以秒为单位)执行指定次数的信息输出操作。另外,sar可以为所收集的许多数据点提供平均信息。以下示例提供了某个4路SMP系统的统计信息,并每隔5s采集一次数据。

1. CPU利用率

11:09:13   CPU  %user  %nice  %system %iowait  %idle
11:09:18   all   0.00   0.00     4.70   52.45  42.85
11:09:18     0   0.00   0.00     5.80   57.00  37.20
11:09:18     1   0.00   0.00     4.80   49.40  45.80
11:09:18     2   0.00   0.00     6.00   62.20  31.80
11:09:18     3   0.00   0.00     2.40   41.12  56.49
11:09:23   all   0.00   0.00     3.75   47.30  48.95
11:09:23     0   0.00   0.00     5.39   37.33  57.29
11:09:23     1   0.00   0.00     2.80   41.80  55.40
11:09:23     2   0.00   0.00     5.40   41.60  53.00
11:09:23     3   0.00   0.00     1.40   68.60  30.00
. . .
Average:   all   0.00   0.00     4.22   16.40  79.38
Average:     0   0.00   0.00     8.32   24.33  67.35
Average:     1   0.00   0.00     2.12   14.35  83.53
Average:     2   0.01   0.00     4.16   12.07  83.76
Average:     3   0.00   0.00     2.29   14.85  82.86

网络和磁盘服务进程是耗用CPU的系统组件之一。当操作系统生成I/O活动时,相应的设备子系统会作出响应,并使用硬件中断信号来指示I/O请求已完成。操作系统对这些中断进行计数。输出结果有助于可视化呈现网络和磁盘I/O活动的速率。sar(1)提供了这种输入。利用性能基线也许可以对系统中断速率进行跟踪,这将是操作系统开销的另一个来源或者系统性能潜在变化的指示器。“-I SUM”选项可以生成如下信息,包括每秒的中断总次数。“-I ALL”选项可以为每个中断源提供类似信息(未显示)。

2. 中断速率

10:53:53         INTR    intr/s
10:53:58          sum   4477.60
10:54:03          sum   6422.80
10:54:08          sum   6407.20
10:54:13          sum   6111.40
10:54:18          sum   6095.40
10:54:23          sum   6104.81
10:54:28          sum   6149.80
. . .
Average:          sum   4416.53

在SMP机器上,可以通过sar -A命令获得基于CPU的中断分布视图(以下示例摘录自完整的输出结果)。注意系统的IRQ取值为0、1、2、9、12、14、17、18、21、23、24和25。由于页宽度的限制,中断9、12、14和17的信息已省略显示。

3. 中断分布

10:53:53  CPU  i000/s i001/s i002/s ... i018/s  i021/s i023/s i024/s  i025/s
10:53:58    0 1000.20   0.00   0.00 ...  0.40    0.00    0.00   3.00    0.00
10:53:58    1    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00 2320.00
10:53:58    2    0.00   0.00   0.00 ...  0.00 1156.00    0.00   0.00    0.00
10:53:58    3    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00    0.00
Average:    0  999.94   0.00   0.00 ...  1.20  590.99    0.00   3.73    0.00
Average:    1    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00  926.61
Average:    2    0.00   0.00   0.00 ...  0.00  466.51    0.00   0.00 1427.48
Average:    3    0.00   0.00   0.00 ...  0.00    0.00    0.00   0.00    0.00

对中断分布的研究可能揭示出中断处理机制中的不平衡性。下一步需要对调度器进行分析。解决该问题的一种方法是通过为特定设备的中断(或IRQ)设置与某个特定CPU或一组CPU相关的亲合度,将IRQ处理绑定到特定的某个处理器或许多处理器上。例如,如果0x0001被回显到/proc/irq/ID(其中ID对应于一个设备),则只有CPU 0才处理该设备的IRQ;如果0x000f被回显到/proc/irq/ID,则CPU 0~CPU 3将负责处理该设备的IRQ。对于某些工作负荷而言,这种技术可以减少在繁重使用的特定处理器上发生的竞争现象。这项技术可以更高效地处理I/O中断,从而相应地提高I/O性能。

2、内存利用率

工作负荷有可能会耗尽所有可用的内存。Linux提供了对物理内存进行合理、高效的访问并可以访问潜在的海量虚存的技术。虚存通常稍多于操作系统实际拥有的内存容量,以便将较少使用的数据卸载到磁盘存储器上,同时又呈现出系统拥有大量物理内存的假象。糟糕的是,卸载内存的开销可能会比应用延迟高出数十甚至上百倍。如果被换出到磁盘上的内存空间是错误的内存页,或者如果应用程序的当前内存印迹大于物理内存容量的话,那么这些过高的延迟会极大地影响应用的响应时间。

许多性能问题都是由于内存不足而引起操作系统的交换。因此,有必要利用一些工具来监视内存的使用情况,例如,每个进程或线程的内核内存占用量,以及内核数据结构的内存使用机制及其数量和大小。与CPU利用情况一样,理解操作系统和各个进程的行为对于跟踪内存短缺所引起的任何性能问题至关重要。

/proc/meminfo与/proc/slabinfo

Linux 在/proc文件系统中提供了可以监视系统内存资源整体利用情况的工具,即/proc/meminfo和/proc/slabinfo。这两个文件可以捕获物理内存的状态。/proc/meminfo的部分显示结果如下所示。

MemTotal:      8282420 kB
MemFree:       7942396 kB
Buffers:         46992 kB
Cached:         191936 kB
SwapCached:          0 kB
HighTotal:     7470784 kB
HighFree:      7232384 kB
LowTotal:       811636 kB
LowFree:        710012 kB
SwapTotal:      618492 kB
SwapFree:       618492 kB
Mapped:          36008 kB
Slab:            36652 kB

参数如下所示:

  • MemTotal显示了物理内存总量,而MemFree显示了未用内存的总量。
  • Buffers对应于I/O操作的缓冲区cache,Cached表示从磁盘上读取文件时所用的内存大小。
  • SwapCached表示已被换出到交换空间中的内存缓存大小。
  • SwapTotal表示用于交换用途的磁盘内存大小。如果基于IA32的系统拥有1GB以上的物理内存,则HighTotal为非零值。
  • HighTotal对应高于860MB的物理内存。
  • LowTotal是内核使用的内存。Mapped对应于被内存映射的文件大小。
  • Slab表示为内核数据结构分配的内存。通过定期捕获/proc/meminfo文件的信息,可以建立起内存使用的模式。在简单脚本和图形工具的帮助下,还能够对该模式加以可视化地展现。

要理解内核内存使用情况,可以查看/proc/slabinfo文件。其部分显示结果如下所示。

  • tcp_bind_bucket       56    224       32    2    2    1
  • tcp_open_request      16     58       64    1    1    1
  • inet_peer_cache          0      0        64    0    0    1
  • secpath_cache            0      0     32    0    0    1
  • flow_cache                0      0     64    0    0    1

第1列显示出内核数据结构的名称。更具体地,总共存在着224个tcp_bind_bucket对象,其中有56个是活跃的。每个数据结构占用32B。存在着两个页面至少拥有一个活跃对象,总共存在着两个已分配页面。另外,对于每个slab结构都分配一个页面。这些信息突出强调了值得更多关注的特定数据结构,例如数量或长度取值更大的数据结构。因此,通过一起捕获meminfo和slabinfo信息,能够理解操作系统中哪些组件当前消耗的内存最多。如果LowFree或HighFree的取值相对较小(或小于平常值),可能表明操作系统中存在着比平时更多的内存请求,这可能导致整体性能或应用响应速度的降低。

ps

要获知特定进程中的内存使用情况,可以使用ps工具来获取每个进程的内存占用情况。

$ ps aux
USER PID %CPU %MEM   VSZ  RSS TTY STAT START TIME COMMAND
root   1  0.0  0.0  1528  528 ?   S    15:24 0:00 init [2]
root   2  0.0  0.0     0    0 ?   SN   15:24 0:00 [ksoftirqd/0]
root   3  0.0  0.0     0    0 ?   S<   15:24 0:00 [events/0]
root   4  0.0  0.0     0    0 ?   S<   15:24 0:00 [khelper]
root   5  0.0  0.0     0    0 ?   S<   15:24 0:00 [kacpid]
root  48  0.0  0.0     0    0 ?   S<   15:24 0:00 [kblockd/0]
root  63  0.0  0.0     0    0 ?   S    15:24 0:00 [pdflush]
root  64  0.0  0.0     0    0 ?   S    15:24 0:00 [pdflush

ps aux的输出结果显示了每个进程消耗系统内存的总体百分比,以及该进程的虚存印迹(VSZ)和当前使用的物理内存量(RSS)。也可以使用top(1)通过交互方式对进程列表进行排序,以便查看哪些进程当前消耗的内存最多,以及内存使用情况如何随着系统的运行而变化。

当标识出需要关注的进程后,可以查看这些进程的虚址空间布局,从而获知进程当前使用内存的具体分配情况。/proc/pid/maps包含了进程地址空间的所有映射及其大小,其中pid是通过ps(1)或top(1)命令获得的特定进程ID。每个映射显示了被分配的地址范围、页面的许可权限,以及与该地址范围相关的后备存储器(backing store)(如果存在的话)的位置。/proc/pid/maps本质上并不是一种性能工具;然而,它提供了关于内存分配状况的信息。例如,出于性能分析的目的,可以确认在虚址空间中的1GB和2GB之间是否分配了特定数量的共享内存。可以根据前述的映射图来检查其使用情况。

以下是关于进程ID 3162的输出结果。

$ cat /proc/3162/maps
08048000-08056000 r-xp 00000000 03:05 33015  /usr/lib/gnome-applets/battstat-applet-2
08056000-08058000 rw-p 0000d000 03:05 33015  /usr/lib/gnome-applets/battstat-applet-2
08058000-08163000 rw-p 08058000 00:00 0
40000000-40016000 r-xp 00000000 03:02 40006   /lib/ld-2.3.2.so
40016000-40017000 rw-p 00015000 03:02 40006   /lib/ld-2.3.2.so
40017000-40018000 rw-p 40017000 00:00 0
40018000-4001a000 r-xp 00000000 03:05 578493  /usr/X11R6/lib/X11/locale/lib/common/xlcDef.so.2
4001a000-4001b000 rw-p 00001000 03:05 578493  /usr/X11R6/lib/X11/locale/lib/common/xlcDef.so.2
4001b000-4001d000 r-xp 00000000 03:05 128867  /usr/lib/gconv/ISO8859-1.so
4001d000-4001e000 rw-p 00001000 03:05 128867  /usr/lib/gconv/ISO8859-1.so
4001f000-40023000 r-xp 00000000 03:05 514375  /usr/lib/gtk-2.0/2.4.0/loaders/libpixbufloader-png.so
40023000-40024000 rw-p 00003000 03:05 514375  /usr/lib/gtk-2.0/2.4.0/loaders/libpixbufloader-png.so
40025000-40031000 r-xp 00000000 03:05 337881   /usr/lib/libpanel-applet-2.so.0.0.19
40031000-40032000 rw-p 0000c000 03:05 337881   /usr/lib/libpanel-applet-2.so.0.0.19
40032000-400d2000 r-xp 00000000 03:05 337625   /usr/lib/libgnomeui-2.so.0.600.1
400d2000-400d6000 rw-p 0009f000 03:05 337625   /usr/lib/libgnomeui-2.so.0.600.1
400d6000-400d7000 rw-p 400d6000 00:00 0
400d7000-400df000 r-xp 00000000 03:05 53       /usr/X11R6/lib/libSM.so.6.0
400df000-400e0000 rw-p 00007000 03:05 53       /usr/X11R6/lib/libSM.so.6.0
400e0000-400f4000 r-xp 00000000 03:05 51       /usr/X11R6/lib/libICE.so.6.3
400f4000-400f5000 rw-p 00013000 03:05 51       /usr/X11R6/lib/libICE.so.6.3

vmstat

前面“CPU利用率”一节中介绍过vmstat,vmstat的主要目的是监视内存可用性和交换活动,还可以提供I/O活动的概况。vmstat可协助发现异常的系统活动,例如会导致操作系统性能下降的过多的页面错误或上下文切换操作。vmstat的输出样本如下所示。

procs ---------memory-------- ---swap-- -----io---- --system-- ----cpu-----
r   b   swpd   free   buff  cache  si   so    bi    bo  in    cs us sy id wa
18  8      0 5626196   3008 122788  0   0  330403  454 2575  4090 91  8  1  0
18 15      0 5625132   3008 122828  0   0  328767  322 2544  4264 91  8  0  0
17 12      0 5622004   3008 122828  0   0  327956  130 2406  3998 92  8  0  0
22  2      0 5621644   3008 122828  0   0  327892  689 2445  4077 92  8  0  0
23  5      0 5621616   3008 122868  0   0  323171  407 2339  4037 92  8  1  0
21 14      0 5621868   3008 122868  0   0  323663   23 2418  4160 91  9  0  0
22 10      0 5625216   3008 122868  0   0  328828  153 2934  4518 90  9  1  0

Vmstat可以报告以下与内存相关的数据:

  • memory部分的单位为KB,显示被换出内存容量(swpd)、空闲内存容量(free)、I/O数据结构的缓冲区缓存容量(buff),以及从磁盘读取文件时所用的内存缓存容量(cache)。
  • swap部分显示从磁盘上换入的内存量(si)以及换出到磁盘上的内存量(so),单位为KB/s。
  • io部分显示从设备上读入的块数(bi)以及写出到设备上的块数(bo),单位为KB/s。

对于I/O操作密集的工作负荷,可以监视bi和bo来获取传输速率,监视in来获取中断速率。可以通过监视swpd、si和so来查看操作系统是否正在执行交换活动,还可以再检查交换速率。最常见的量度也许是CPU利用率以及对us、sy、id和wa的监视。如果wa取值很大,则需要检查I/O子系统,结论有可能是需要更多的I/O控制器和磁盘以便减少I/O等待时间。

3、I/O利用率

尽管整体的处理器速度、内存大小以及I/O执行速度在不断提高,但I/O操作的吞吐率和延迟性能仍然要比等价的内存访问操作低多个数量级。另外,由于许多工作负荷都拥有重要的I/O组件,I/O处理很容易成为整体吞吐率和应用整体响应时间的重要瓶颈。针对I/O操作密集的应用,性能分析人员必须通过工具来获取关于I/O子系统操作的信息。

磁盘I/O的性能经常基于吞吐率和延迟来评估。磁盘驱动器对大型顺序传输的处理常常远优于小型随机传输操作。对大型顺序传输操作可以进行优化例如预读技术或延迟写技术,存储系统还能够尽量减少磁头移动并执行全磁道写操作。然而,许多应用都需要访问存储介质中位于毫无关联且经常难以预测的地址上的数据。因此,各种工作负荷的I/O模式常常是顺序I/O和随机I/O的混合体,并且执行各种尺寸的块传输操作。

要理解软件瓶颈及相关的性能影响,在两个主要因素需要考虑,即各种具体I/O请求的整体I/O吞吐率和延迟。理想情况下,系统希望对读写介质的数据传输率加以优化。但是,由于单个请求的延迟与处理器速度相比是极长的时间,应用实质上会等待I/O处理。例如,假定某个应用读取一块数据,其中提供了关于如何访问下一块数据的信息,等等。如果系统或应用无法对这种模式进行优化,则性能被限制为I/O子系统的组合延迟。该问题的一种通用解决方案是同时执行许多与此类似的操作。多任务处理,即大量任务并行运行的能力,允许应用或操作系统同时调度许多高延迟的I/O请求,即使当每个应用可能花费大量时间阻塞在单个请求上。结果,I/O子系统的整体效率或者I/O总吞吐率可能会接近底层I/O子系统的能力。另外,尽管对系统整体吞吐率加以优化始终是操作系统和具体应用的目标,但以终端用户响应时间为代价来达成该目标通常是不可接受的权衡抉择。

数据传输请求的输入模式会对下层I/O子系统的延迟产生严重影响。例如,若磁盘I/O请求交替地访问位于磁盘介质起始处和结束处的一个I/O块,则磁盘臂可能需要进行相对缓慢的调整以便将磁头定位到选定的磁盘块上。这种类型的访问显然会减慢对给定设备的所有访问,从而会减少在一段时间内可以完成的I/O操作次数。另外,这种异常的访问模式有可能不只是减少每个逻辑驱动器的设备数目,而且还会降低整体的I/O传输速率。

多任务处理的另一种解决方案是确保来自应用和操作系统的数据请求能够很好地分布于系统上的磁盘上。将I/O请求分布到多个磁盘上会对并行度产生影响,而并行性可以进一步减少磁盘驱动器延迟的性能影响。将应用数据重新分布到大量磁盘设备常常需要深入理解工作负荷以及该工作负荷的数据访问模式。

尽管系统监视工具并不提供对特定应用执行的所有I/O操作都进行跟踪的能力,但有些性能监视工具允许性能分析人员监视系统处理的I/O操作总数、每个逻辑磁盘驱动器的I/O操作数目,以及整体的I/O传输率。下面几节主要讨论iostat(1)和sar(1)两种工具。可以使用这些性能监视工具来理解I/O瓶颈位于何处、哪些磁盘或互连结构未被充分利用,以及从系统角度来显示的延迟大小(相对于应用的角度)。

在分析特定工具之前,应记住存在着许多可以提高I/O性能的技术。这些技术包括纯硬件相关的解决方案(例如使用每分钟具有更高转速的磁盘驱动器,从而提供了更低的I/O延迟、更大的磁盘cache容量或I/O控制器cache容量)。这些技术也包括改进读写操作的数据传输率,以及提高I/O总线速度或I/O互连结构的速度,这两者都可以提高数据传输率并减少I/O延迟。一些磁盘驱动器和磁盘存储子系统还提供了多端口的逻辑或物理磁盘,从而允许单个磁盘发出的并行I/O操作,这也提高了潜在的I/O吞吐率。另外,硬件和软件RAID(Redundant Array of Independent Disks)被设计为通过在多个磁盘驱动器上对数据进行分条处理来提高访问并行性。

下面讨论的工具可以提供有助于设计软硬件解决方案以及数据布局改进的数据。

iostat

iostat命令监视系统的I/O活动,检查物理磁盘就平均传输率而言处于活跃状态之中的时间长度。该命令生成的报告可用于修改系统配置以便更好地平衡物理磁盘之间的I/O负荷。iostat(1)还提供了有助于直接与I/O活动进行比较的CPU利用率。如果对显示时间间隔未作规定的话,则iostat显示系统自从上次启动以来的I/O信息;否则,第一组输出显示系统自从启动以来的全部活动信息,而后续的输出内容只显示活动变化信息。以下显示信息对应于将文件从/dev/sdo7复制到/dev/sds7,从/dev/sdp7复制到/dev/sdt7,从/dev/sdr7复制到/dev/sdu7的操作执行结果。

avg-cpu:  %user   %nice    %sys %iowait   %idle
          0.21    0.00    0.80    2.07   96.92

Device:  tps Blk_read/s Blk_wrtn/s   Blk_read   Blk_wrtn
sdx     0.00       0.00      0.00         32          0
sdw     0.00       0.00      0.00         32          0
sdv     0.00       0.00      0.00         32          0
sdu     2.49       0.05   1443.46       2778   79552392
sdt     4.94       0.10   2871.73       5322    158268008
sds     4.95       0.10   2860.91       5330    157671720
sdr    30.20    1518.55      0.42   83690898      23288
sdq    60.25    2902.76      0.92  159978258      50896
sdp     0.00       0.01      0.00        378         24
sdo    59.49    2883.87      0.90  158937034      49520

iostat报告的CPU利用信息类似于top工具所提供的内容。它将CPU时间划分成用户、nice、系统、I/O等待以及系统空闲等5个部分,之后给出磁盘利用情况的报告。磁头信息后跟随着多行磁盘统计信息,其中每行报告一个已配置的逻辑磁盘的活动情况。tps列表示发至逻辑磁盘的I/O请求数,但没有给出I/O请求的大小。Blk_read/s和Blk_wrtn/s表示读写该逻辑驱动器的数据量,以每秒的块数为单位,但也未给出块大小设置。Blk_read和Blk_wrtn分别对应于读写该逻辑驱动器的数据量,以每秒的块数为单位,但没有指定块大小。

选项-k以千字节为单位显示统计数据,选项-p可以获取每个分区的统计数据,选项-x可以获得诸如平均等待时间和平均服务时间等信息。在这些取值中,当数据从sdo7被复制到sds7时,sdo的Blk_read数非常接近于sds的Blk_wrtn数。另外,读速率稍高于写速率。这个报告可以突出显示磁盘I/O瓶颈(如果存在的话),并有助于数据库设计人员为获取更高的访问并行性而对数据进行布局。

sar

sysstat软件包中包含sar工具。sar收集并报告操作系统中的大量系统活动,包括I/O操作、CPU利用情况、上下文切换和中断速率、页换入和页换出的速率,以及共享内存、缓冲区和网络的使用情况。基于数量和时间间隔参数的取值,sar在以秒为单位的指定时间间隔内执行指定次数的输出信息操作。例如命令sar -b 3 12表示每隔3s报告磁盘使用情况,总共运行12秒。另外,在数据采集结束后,给出了统计平均数据。sar是一个具有丰富选项的工具。本节其余部分将讨论该工具的几个特性。

sar显示I/O统计数据的方式类似于iostat,可以提供I/O操作的总次数(tps),并将其进一步分为读操作(rtps)和写操作(wtps);还给出读写操作速率(bread/s和bwrtn/s)。以下数据每隔2s采集一次,总共运行18s。在数据采集结束后,计算出这5个域的平均值,但并未给出具体逻辑驱动器的操作。

12:59:15       tps     rtps     wtps   bread/s   bwrtn/s
12:59:17     37.50    37.50     0.00        396.00      0.00
12:59:19     66.50    66.50     0.00  16140.00      0.00
12:59:21    268.50   268.50     0.00 66560.00      0.00
12:59:23    333.50   261.50    72.00  64548.00   9620.00
12:59:25    153.50    40.50   113.00   9728.00  27984.00
12:59:27    133.00     5.00   128.00   1024.00  31744.00
12:59:29    119.50     7.50   112.00   1536.00  27776.00
12:59:31    133.00     5.00   128.00   1024.00  31744.00

Average:    155.63    86.50    69.13  20119.50  16108.50

sar提供了关于单个处理器以及整个系统的CPU利用率数据。这个特性在多处理器环境中尤其有用。如果某些处理器执行的工作多于其他处理器,则显示结果会清楚地表明这一点。然后就可以检查处理器的这种使用不均衡性是来自应用还是来自内核调度器。以下数据每隔5s从一个4路的SMP系统采集获得。

11:09:13   CPU  %user  %nice   %system   %iowait  %idle
11:09:18   all   0.00   0.00      4.70     52.45  42.85
11:09:18     0   0.00   0.00      5.80     57.00  37.20
11:09:18     1   0.00   0.00      4.80     49.40  45.80
11:09:18     2   0.00   0.00      6.00     62.20  31.80
11:09:18     3   0.00   0.00      2.40     41.12  56.49
11:09:23   all   0.00   0.00      3.75     47.30  48.95
11:09:23     0   0.00   0.00      5.39     37.33  57.29
11:09:23     1   0.00   0.00      2.80     41.80  55.40
11:09:23     2   0.00   0.00      5.40     41.60  53.00
11:09:23     3   0.00   0.00      1.40     68.60  30.00
. . .
Average:   all   0.00   0.00      4.22     16.40  79.38
Average:     0   0.00   0.00      8.32     24.33  67.35
Average:     1   0.00   0.00      2.12     14.35  83.53
Average:     2   0.01   0.00      4.16     12.07  83.76
Average:     3   0.00   0.00      2.29     14.85  82.86

sar还提供了处理器的中断信息。

10:53:53  CPU  i000/s  i001/s  i002/s  i003/s  i004/s  i005/s  i006/s  i007/s
10:53:58    0 1000.20    0.00    0.00    0.40    0.00    0.00    3.00    0.00
10:53:58    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00 2320.00
10:53:58    2    0.00    0.00    0.00    0.00 1156.00    0.00    0.00    0.00
10:53:58    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

Average:    0  999.94    0.00    0.00    1.20  590.99    0.00    3.73    0.00
Average:    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00  926.61
Average:    2    0.00    0.00    0.00    0.00  466.51    0.00    0.00 1427.48
Average:    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

对中断分布的研究揭示了中断处理的不均衡性。解决这个问题的一种方法是将IRQ处理亲合到某个特定处理器或大量处理器上。例如,如果0x0001被回显至/proc/irq/ID(其中ID对应于某个设备),则只有CPU 0才处理该设备的IRQ。如果0x000f被回显至/proc/irq/ID,则CPU 0~CPU 3将被用于处理该设备的IRQ。对于某些工作负荷而言,这种技术可以减少在繁重使用的特定处理器上出现的竞争现象。该技术可以更高效地处理I/O中断,从而相应地提高I/O性能。

4、网络利用率

Linux不仅提供了其他主要操作系统也拥有的许多强大的网络能力,并且还通过引入伪装等额外特性而更胜一筹。Linux内核不但支持多种网络互连协议例如 TCP/IP、IPX (Internetwork Packet Exchange)和AppleTalk DDP等,还支持诸如报文转发、防火墙操作、代理、伪装(masquerading)、隧道以及别名(aliasing)等特性。

Linux中提供了许多有助于评估各种Linux网络性能的监视工具,其中一些监视工具也可用于解决网络问题以及监视性能。Linux内核为用户提供了大量的网络系统信息,这有助于监视网络的健康状态并检测在配置、运行期间以及性能方面出现的问题。

本节只分析在大多数Linux主要发行版本中提供的一些网络工具,包括netstat、nfsstat、tcpdump、ethtool、snmp、ifport、ifconfig、route、arp、ping、traceroute、host以及nslookup等。

系统和网络管理员每天都会使用其中的某些工具。诸如ping、route、arp、traceroute、ethtool及tcpdump之类的工具常用于判定网络问题。这些工具描述如下:

ping ipaddress/hostname命令可以显示计算机是否正在运行以及网络连接是否正常。该命令使用互联网控制消息协议(Internet Control Message Protocol,ICMP)中的Echo功能。该命令通过网络将一个小型报文发至指定的IP地址。如果可以收到该报文的应答消息,则表明这条计算机网络连接是存活的。该命令还可以显示出在源计算机和目的计算机之间存在着多少个中间跳数。

route命令可以显示路由表内容,在路由表中增删路由,以及清空所有的路由信息。

如果ping命令不起作用,即网络连接没有激活,那么可以使用arp命令来确定问题根源。该命令的-a选项可以确定硬件地址是否正确地关联到适当的系统上,其他可用的选项包括清空arp缓存、向arp缓存中添加信息等。

IRRTtoolset(Internet Routing Register toolset)提供了自动完成路由器配置、路由策略分析以及维护的工具,使得网络工程师能够更加便捷、有效地使用路由信息。

ifconfig可以确定主机的介质访问控制地址。如果网络上存在着另一台具有相同IP地址的主机,则该主机的介质访问控制地址可能已存在于本机的arp缓存中。在这种情况下,可以使用arp命令来删除缓存中保存的地址并将正确的地址添加到arp缓存中。

traceroute可以跟踪报文的某条路由路径。当报文在网络中传输时,该命令能够测量报文在每一跳(路由器)之间传输所用的时间,并标识出每一跳的地址。

ethtool可以查询并修改以太网设备的设置参数。每个设备都被分配一个标识编号,例如对于系统中的n个以太网设备,其编号为eth0、eth1…ethn。ethtool工具使用这种设备名称来查询/修改设置信息。

tcpdump对网络报文进行嗅探,能够捕获计算机在网络上可见的所有报文。该工具可用于网络监视、协议调试以及数据获取等功能。该命令将NIC设置为杂收(promiscuous)模式以便捕获所有流经物理线路的报文。该命令提供了大量关于输出结果的过滤选项,可以只显示需要关注的报文类型。但其缺点是缓冲区可能会发生溢出。在高带宽网络上执行tcpdump操作还有可能会丢弃报文,即tcpdump的处理速度无法匹配报文的传输速率。

ethereal是另一种类似于tcpdump的网络嗅探工具,可以读取tcpdump所捕获的文件。

host工具用于从域名系统(Domain Name System)中获取指定IP地址的主机名。该工具远比nslookup更灵活,并且适于在shell脚本中使用。

Linux上提供的网络安全工具包括snort(一种网络入侵检测系统)、dsniff(一套强大的网络审计和渗透测试工具)以及SAINT(Security Administrator's Integrated Network Tool)等。

网络统计信息

Net-tools软件包中提供的netstat工具可以显示大量与网络子系统相关的信息。

Netstat是监视Linux服务器上网络连接的最常用工具之一。该工具可以显示每种网络协议例如TCP和UDP的活跃socket列表,还提供了关于网络路由的信息以及网络接口的累积统计数据,包括输入输出报文数量以及报文冲突次数。随后的netstat输出信息显示了大量网络协议统计数据和路由信息,例如互联网协议(IP)、传输控制协议(TCP)和用户数据报协议(UDP)。基于这些统计信息,可以判定收到的报文数目是否高于或低于预期值。该工具可以方便地用于研究内核版本之间的性能差异。

如果没有任何参数的话,netstat可以枚举出已有的网络socket及其连接情况,并且能够显示所有协议系列(包括UNIX域套接字)的信息。以下是输出样本中的典型数据行。

$ netstat

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address     Foreign Address     State
tcp        0      0           *:32768              *:*                               LISTEN
tcp        0      0           *:smux               *:*                               LISTEN
tcp        0      0           *:9099               *:*                               LISTEN
tcp        0      0           *:sunrpc         *:*                               LISTEN
tcp        0      0           *:x11                 *:*                               LISTEN
tcp        0      0           *:http               *:*                               LISTEN
tcp        0      0           *:ftp                 *:*                               LISTEN
tcp        0      0           *:ssh                 *:*                               LISTEN
tcp        0      0           *:telnet         *:*                               LISTEN
tcp        0      0           nethostA:smtp    *:*                              LISTEN
tcp        0      0           nethostA:32974   nethostB:ssh            ESTABLISHED
tcp        0      0           nethostA:32996   nethostB:ssh            ESTABLISHED
tcp        0      0           nethostA:33002   64.233.161.99:http     ESTABLISHED
tcp        0      0           nethostA:33005   nethostB:ftp            ESTABLISHED
udp        0      0           *:32768              *:*
udp        0      0           *:snmp               *:*
udp        0      0           *:sunrpc         *:*

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     2012     /dev/gpmctl
unix  2      [ ACC ]     STREAM     LISTENING     159792 /tmp/ksocket-nivedita/kdeinit-:0
unix  2      [ ACC ]     STREAM     LISTENING     2210   /tmp/.X11-unix/X0
unix  2      [ ACC ]     STREAM     LISTENING     79840  /tmp/.ICE-unix/dcop15789-1077867386

第1列显示了socket的协议系列,它通常是tcp(transport control protocol,传输控制协议)、udp(user datagram protocol,用户数据报协议)或unix(UNIX domain socket,UNIX域套接字);第2列和第3列显示了在socket接收和发送队列中当前存在的数据字节数;后面各列显示了本地和远程地址及端口信息;最后一列显示了socket当前的协议状态。

如果netstat命令未携带标志-n的话,则IP地址通常转换成主机名(nethostA、nethostB)。

如果只要显示特定地址系列的内容,可以在命令中提供相应的标志。例如, netstat –tcp或-t只显示当前的TCP socket。关于各个地址系列的完整标志列表参见netstat的man命令帮助。

星号(*)表示通配符,在指代本地地址时通常是监听所有本地接口的监听进程。当该socket向远程主机发起连接并进入已建立(established)状态时,会显示出远程主机地址和端口信息。在上述显示例子中可以看到当前存在的ssh、http和ftp连接。

接口信息

Netstat给出的接口信息与ifconfig命令所显示的内容相同。该信息是接口所提供的统计信息列表。这些信息包括最大传输单元(maximum transmission unit、MTU),以及接收和发送报文中传输成功的、通过某种方式出错的、丢弃的或溢出的报文数。

$ netstat -i

Kernel Interface table
Iface   MTU Met   RX-OK RX-ERR RX-DRP RX-OVR   TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0   1500 0     21941      0     0      0   11998        0     0      0 BMRU
lo    16436 0       795      0     0      0     795         0     0      0 LRU

TCP/IP协议统计数据

Linux内核支持将RFC 2012中规定的统计计数器作为简单网络管理协议(Simple Network Management Protocol,SNMP)的管理信息库(Management Information Base,MIB)的组成部分。它还实现了大量与Linux相关并且捕获网络协议事件(主要是TCP)的计数器。

netstat工具显示了存在于内核中的大多数计数器,但并未涵盖全部计数器。要查看被计数事件的完整列表,可以浏览/proc/net/snmp和/proc/net/netstat文件的内容。前者包含了RFC 2012中定义的计数器,后者包含了与Linux相关的扩展MIB。以下是由netstat -s命令生成的SNMP计数器的样本列表。

$ netstat -s

Ip:
    662968 total packets received
    0 forwarded
    0 incoming packets discarded
    659592 incoming packets delivered
    162297 requests sent out
Tcp:
    5721 active connections openings
    39 passive connection openings
    0 failed connection attempts
    0 connection resets received
    1 connections established
    136759 segments received
    152791 segments send out
    20660 segments retransmited
    3 bad segments received.
    1165 resets sent
Udp:
    14031 packets received
    15 packets to unknown port received.
    0 packet receive errors
    7519 packets sent

另外,网络通信涉及到繁重的中断处理。因此,通过与netstat工具相结合,可以使用vmstat来捕获中断数目,使用sar来确定中断处理操作的散布情况。

nfsstat

网络文件系统(Network File System,NFS)可以将远程机器的文件系统与本地文件系统融合起来,即NFS使用与本地相同的读写接口来远程访问数据。nfsstat是一个打印NFS内核统计信息的简单工具,可打印出工作负荷中NFS的API调用数量。在以下示例中,服务器运行一个I/O工作负荷。来自nfsstat的输出信息显示的读写操作次数,可用于调试目的。也可根据读写操作的次数来进一步理解性能问题。

Server nfs v3:
null       getattr    setattr    lookup     access     readlink
0       0% 8       0% 0       0% 6          0% 43      0% 0       0%

read       write      create     mkdir      symlink    mknod
262242 44% 328004  55% 2       0% 0     0% 0       0% 0       0%

remove     rmdir      rename     link       readdir    readdirplus
3       0% 0       0% 0       0%   0           0% 0       0% 0      0%

fsstat     fsinfo     pathconf   commit
1       0% 1       0% 0       0% 2586    0%

参考:《Linux服务器性能调整》
作者: [美] SanderaK.John
出版社: 清华大学出版社


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux - 系统性能监控 的相关文章

  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • Linux 阻塞与非阻塞串行读取

    I have 这段代码 https stackoverflow com questions 6947413 how to open read and write from serial port in c用于在Linux中从串行读取 但我不
  • 如果目录不存在,有没有办法让 mv 创建要移动到的目录?

    因此 如果我在主目录中并且想将 foo c 移动到 bar baz foo c 但这些目录不存在 是否有某种方法可以自动创建这些目录 以便你只需要输入 mv foo c bar baz 一切都会顺利吗 似乎您可以将 mv 别名为一个简单的
  • 为什么 proc/ID/maps 有多个共享库条目

    我正在查看嵌入式Linux下的proc ID maps 我注意到一些共享库在进程的内存映射中出现了几次 为什么会这样呢 40094000 400d9000 r xp 00000000 b3 09 723 system lib libc so
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • 如何更改 Kubernetes 中的文件系统观察程序限制 (fs.inotify.max_user_watches)

    我在用着pm2 https github com Unitech pm2查看保存我的应用程序服务器的 NodeJS 程序源代码的目录 该程序在 Kubernetes 集群中运行 但是 我收到此错误 ENOSPC System limit f
  • 如何从python导入路径中删除当前目录

    我想使用 Mercurial 存储库hg本身 也就是说 我克隆了 Mercurialhttps www mercurial scm org repo hg https www mercurial scm org repo hg并想运行一些h
  • CMake:使用其他平台的生成器。如何?

    如何使用 CMake 在 Linux 上生成 Visual Studio 项目文件 你不能 您必须在 Windows 上运行 CMake 才能为 Visual Studio 生成
  • 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

    该程序是在 Linux 上用 C 语言开发的客户端服务器套接字应用程序 每个客户端都连接到一个远程服务器并将其自身记录为在线 在任何给定时间点很可能有多个客户端在线 所有客户端都尝试连接到服务器以将自己记录为在线 忙碌 空闲等 那么服务器如
  • 有没有办法改变vim的默认模式

    有谁知道如何更改vim的默认模式 它的默认模式是命令模式 但是我可以将其更改为插入模式吗 只需将以下行添加到您的 vimrc 中 start Vim s default mode will be changed to Insert mode
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • mod_perl 无法看到 /tmp 中的文件

    我有一些 mod perl 代码试图访问 tmp 下的文件 但它抛出 没有这样的文件或目录 错误 我在代码中添加了一个 ls al tmp 来查看 Perl 在目录中看到的内容 它只给了我 和 drwxrwxrwt 2 root root
  • 如何从powershell获取主机名?

    我如何获得hostname https stackoverflow com q 42014215 262852 for dur来自 powershell PS home thufir powershell gt PS home thufir
  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • 使用 xargs 时如何获取退出代码(并行)

    我制作了一个用于启动并行 rsync 进程的脚本 bin bash LIST 1 DEST DIR 2 RSYNC OPTS 3 echo rsyncing From SRC DIR To DEST DIR RSYNC OPTS RSYNC
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • 打破条件变量死锁

    我遇到这样的情况 线程 1 正在等待条件变量 A 该变量应该由线程 2 唤醒 现在线程 2 正在等待条件变量 B 该变量应该由线程 1 唤醒 在我使用的场景中条件变量 我无法避免这样的死锁情况 我检测到循环 死锁 并终止死锁参与者的线程之一

随机推荐

  • spring boot 的 ApplicationContext 及 getbean

    在spring中 我们通过如下代码取得一个spring托管类 ApplicationContext ac new FileSystemXmlApplicationContext applicationContext xml ac getBe
  • 红日安全vulnstack-ATT&CK实战系列 红队实战(四)

    一 介绍 下载地址http vulnstack qiyuanxuetang net vuln detail 6 strusts漏洞利用phpmyadmin getshell tomcat 漏洞利用 docker逃逸 ms14 068 ssh
  • AutoScraper——爬虫神器

    AutoScraper是一个自动化的爬虫工具 非常智能 而且使用简单便捷 AutoScraper 是使用 Python 实现的 Web 爬虫 兼容 Python 3 能快速且智能获取指定网站上的数据 在github上具有4 8K githu
  • springboot结合redis(保存用户登录信息)

    一 导入包
  • 1.计算机图形学 实验 线条(利用C语言图形函数绘图)

    1 修改例1的代码 改变顶点个数 要求50个顶点 使得得到的图形更逼近于正圆 在实验报告中给出完整的代码和对应的运行结果截图 include
  • 用python比较大小

    1 比较 ax lt xa 的大小 代码为 print ax lt xa 结果为True print ord a print ord x 字符串是通过ASCII表来进行顺次为比较大小 2 is与 的区别 print 1 is True 为F
  • Java为什么不能写大型游戏?

    所谓大游戏 一般指端游 必须是C 没办法 C 和java的效率还是有很大差距的 基本上所有东西都可以用java开发 但是java致命的一点就是不能直接操作内存 只能安装虚拟机 这就造成了java的开发有很多局限性 但是java提供了本地方法
  • python 简单k近邻分类器的实现

    1 问题 在此使用k近邻算法实现一个简单分类器 其中model xls表样式如下表1所示 表1 model xls数据表 分析 数据存放在model xls中 需要利用panda数据 对数据进行切片为指标和结果 切片后的数据类型为dataf
  • 教你几种MySQL 中常见的高可用架构部署方案

    MySQL 中的集群部署方案 前言 这里来聊聊 MySQL 中常用的部署方案 MySQL Replication MySQL Replication 是官方提供的主从同步方案 用于将一个 MySQL 的实例同步到另一个实例中 Replica
  • 现代控制理论4——线性系统状态方程的解

    注 本文是在MOOC平台上学习西北工业大学 现代控制理论基础 郭建国 赵斌 郭宗易 的课程进行随笔记录与整理 一 线性定常连续系统状态方程的解 齐次方程 1 求解 齐次状态方程 x Ax 其解描述的是 即无控情况下在初始状态作用下系统的自由
  • Spring Boot 中的 @Async 注解是什么,如何使用

    Spring Boot 中的 Async 注解是什么 如何使用 引言 在开发 Web 应用程序时 经常需要执行一些耗时的操作 比如发送邮件 生成报表 调用第三方接口等等 这些操作如果在主线程中执行 会导致请求响应时间过长 影响用户体验 为了
  • 双层神经网络模型

    第8到12行为正向传播算法 输出一个损失函数 其中h为sigmod激活函数 第11行为L2损失函数 第14到20行为反向传播算法 使用梯度下降法对权值进行优化 注 常见的几种Activation Functions
  • FAT32文件系统中文件的“修改时间”

    海思 项目背景 项目中用到AV3板 AV1板及CPU板 AV3板给AV1板校时 CPU板给AV3板校时 AV3板是UTC时间 AV1板和CPU板是CST时间 且时区不能修改 问题说明 AV3板产生的文件的 修改时间 在windows里面查看
  • ESP8266 + Arduino (四) 客户端向服务器发送数据信息---2022.3.5

    学习目的 通过两块esp8266模块实现互联 一块作为服务器 另一块作为客户端 连接成功后客户端发送http请求 并通过客户端的按键来控制服务器端的LED 的亮灭 在这个示例中 ESP8266客户端将会通过HTTP协议向ESP8266服务器
  • MySQL数据类型char与varchar中数字代表的究竟是字节数还是字符数?

    实例是最好的说明 所以 废话少说 看表看例子 mysql gt show create table test varchar utf8 G 1 row Table test varchar utf8 Create Table CREATE
  • 搜索引擎使用技巧汇总,一篇就够了

    搜索引擎使用必知必会技巧汇总 写在前面 我们在从互联网获取信息的时候 使用最频繁的莫过于搜索引擎 查Bug 找资源过程中很浪费时间 而学习一些搜索技巧可以大大提高我们的效率 小Tip 注 以下方法在Google搜索引擎上正常使用 百度未测试
  • CodeWhisperer插件使用体验

    官方教程点击跳转 使用工具 1 vscode 2 插件 AWS Toolkit 免费使用 安装以后如何使用 1 首先要有一个aws账号 2 插件下载好以后登录aws账号 我们主要用这款插件的CodeWhisperer这个功能 其它的自行看官
  • C++多态性:虚函数的调用原理

    C 多态性 虚函数的调用原理 多态性给我们带来了好处 多态使得我们可以通过基类的引用或指针来指明一个对象 包含其派生类的对象 当调用函数时可以自动判断调用的是哪个对象的函数 一个函数说明为虚函数 表明在继承的类中重载这个函数时 当调用这个函
  • Python 三目运算符讲解(作用、语法、代码示例)

    这篇文章介绍三目运算符的作用 语法 利用例子体验一下三目运算符 三目运算符的作用 化简代码量的 化简的是非常简单的if else的代码 也就是if条件成立就执行一句代码 不成立就执行另外一句代码 三目运算符含义 三目运算符也叫作三元运算符或
  • Linux - 系统性能监控

    重点讨论一些有助于监视系统整体性能的工具 当理解了工作负荷的系统整体性能特征之后 还可以使用这组工具标识出哪些特定进程是整体工作负荷的性能瓶颈 在许多情况下 系统监视工具有助于推动系统调优工作 使得关键的性能瓶颈得到极大减少或消除 另一些情