運用保守担当者として、Linux システムのパフォーマンスの問題に悩まされたことはありますか?問題のトラブルシューティングに多くの時間とエネルギーを費やしても、問題を正確に特定して分析できない場合もあります。その場合は、Linux のパフォーマンスの問題を迅速にテレメトリーするいくつかの方法を知っておく必要があります。
次の 10 個のコマンドを実行すると、実行中のプロセスとシステムのリソース使用状況を 60 秒以内に大まかに把握できます。これらのコマンドからのエラー メッセージとリソースの飽和出力 (理解しやすい) を確認することで、リソースを最適化できます。飽和とは、リソースの負荷が処理できる制限を超えることです。飽和が発生すると、通常、リクエスト キューの長さまたは待機時間として表れます。
リーリーこれらのコマンドの一部には、sysstat ソフトウェア パッケージの事前インストールが必要です。これらのコマンドによって表示される情報は、さまざまなリソース (CPU、メモリなど) のチェックなど、USE メソッド (パフォーマンスのボトルネックを特定するメソッド) の実装に役立ちます。さらに、問題を特定するプロセス中に、これらのコマンドを使用して、問題の原因となる特定の可能性を除外し、検査範囲を狭め、方向を示すことができます。以下の章では、実稼働環境でのこれらのコマンドの実行を例として、これらのコマンドを簡単に紹介します。これらのツールの使用法について詳しく知りたい場合は、マニュアル ドキュメントを参照してください。
1.稼働時間
リーリーこれは、システム負荷平均をすばやく確認する方法です。システム内で実行するタスク (プロセス) の数が表示されます。Linux システムでは、これらの数値には、CPU で実行する必要があるプロセスとその数が含まれます。実行中のプロセスの数 I/O を待機しているプロセス (通常はディスク I/O)、これはシステム負荷の大まかな表示にすぎませんが、これを見るだけで、特定の状況をさらに理解するには他のツールを使用する必要があります。
最後の 3 つの数値は、1 分、5 分、15 分にわたるシステムの合計負荷平均を指数関数的に圧縮した結果を示しています。システム負荷が時間の経過とともにどのように変化するかがわかります。上記の例では、最後の 1 分間の負荷値が 30 を超えているのに対し、15 分間の平均負荷は 19 にすぎず、システム負荷が時間の経過とともに増加しています。 CPU 負荷など、多くの影響があります。さらに確認するには、vmstat または mpstat コマンドを実行します。これら 2 つのコマンドについては、第 3 章と第 4 章を参照してください。
2.dmesg | テール
リーリーこのコマンドは、最新の 10 件のシステム メッセージを表示します (もちろん、メッセージがまだ存在している場合)、パフォーマンスの問題を引き起こす可能性のあるエラーを探します。
上の例には、oom-killer と TCP によるリクエストのドロップが含まれています。この手順をお見逃しなく。 dmesg コマンドは常に試してみる価値があります。
3.vmstat 1
リーリーvmstat(8) は、仮想メモリ統計の略語です。これは、よく使用されるツール (数十年前に BSD 用に作成されました) です。主要なサーバーの統計概要を各行の最後に出力します。vmstat コマンドは、 1 Run は、各秒の統計概要を出力します (例の vmstat のこのバージョン) 出力の最初の行の列は、前の 1 秒の値ではなく、起動以降の平均値であることが明示的に示されています。
ここでは、最初の行をスキップします。各列を知りたい、覚えておきたくない場合は、次の列を確認してください:
CPU 分解時間は、CPU がビジーかどうかを確認するために、ユーザー時間とシステム時間によって決定されます。I/O の待機時間が変わらない場合は、ディスクのボトルネックを示します。これは、タスクが実行されるため、CPU がアイドル状態であることを示します。サスペンドを待ってブロックされています。ディスク I/O が開始されると、I/O の待機を CPU アイドルの別の形式と考えることができます。これは、CPU がアイドル状態になる理由についての手掛かりを与えます。システム時間は、I/O にとって非常に重要です。 /O 処理。平均システム時間が 20% を超えている場合は、さらなる調査が必要になる可能性があります。おそらく、カーネルの I/O 処理効率が低すぎる可能性があります。
上記の例では、CPU 時間はほぼすべてユーザー レベルで費やされており、アプリケーションが CPU 時間を消費しすぎていることを示しています。また、平均 CPU 使用率も 90% を超えています。もちろん、これは必ずしも問題があるわけではありません。確認してください。 "r "列の彩度でわかります。
4.mpstat -P ALL 1
リーリーこのコマンドは、各 CPU の CPU ブレークダウン時間を出力します。これは、不均一な使用状況をチェックするために使用できます。ビジー状態の 1 つの CPU は、シングル スレッド アプリケーションが実行されていることを表します。
5.pidstat 1
リーリーpidstat コマンドは、top コマンドの各プロセスの統計概要に似ていますが、top の画面更新の代わりに、ローリング統計概要をループで出力します。リアルタイム表示に使用でき、コピーもできます。表示された内容を調査記録にコピーして貼り付けます。
上の例は、2 つの Java プロセスが CPU を消費していることを示しています。 %CPU 列はすべての CPU の合計で、1591% は、この Java プロセスがほぼ 16 CPU を消費することを意味します。
6.iostat -xz 1
$ iostat -xz 1Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 73.96 0.00 3.73 0.03 0.06 22.21 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09 xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25 xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26 dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04 dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00 dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03 [...] ^C
无论是对工作负载还是性能表现来说,这都是一个很棒的用于查看块设备(磁盘)情况的工具。
查看个列:
r/s, w/s, rkB/s, wkB/s:这些分别代表该设备每秒的读次数、写次数、读取 kb 数,和写入 kb 数,这些数值用于描述工作负载情况,性能迟滞问题则可能仅仅是由于施加了过大的负载。 await:表示以毫秒为单位的 I/O 平均消耗时间,这是应用程序消耗的实际时间,因为它包括了排队时间和处理时间,比预期耗用了更多的平均时间就可能意味着设备的饱和,或设备出了问题。 avgqu-sz:向设备发出的请求的平均数量,该值大于 1 说明已经饱和了(虽说设备可以并行处理请求,尤其是由多个磁盘组成的虚拟设备。) %util:设备利用率,这个值是一个显示出该设备在工作时每秒处于忙碌状态的百分比,虽然它取决于设备本身物理性能,若值大于 60%,通常表明性能不佳(可以从 await 中看出),当值接近 100% 通常意味着已饱和。
如果该存储设备是一个面向很多后端磁盘的逻辑磁盘设备,则 100% 利用率可能只是意味着当前正在处理某些 I/O 占用,然而,后端磁盘可能远未饱和,并且可能能够处理更多的工作,请记住,磁盘 I/O 性能较差不一定是程序的问题,许多技术通常是异步 I/O,使应用程序不会被阻塞并遭受延迟(例如,预读,以及写缓冲)。
7. free -m
$ free -m total used free shared buffers cached Mem: 245998 24545 221453 83 59 541 -/+ buffers/cache: 23944 222053 Swap: 0 0 0
右边的两列显式:
buffers:用于块设备 I/O 的缓冲区缓存。 cached:用于文件系统的页面缓存。
我们只是想要检查这些不接近零的大小,其可能会导致更高磁盘 I/O(使用 iostat 确认),和更糟糕的性能,上面的例子看起来还不错,每一列均有很多 M 个大小,比起第一行,-/+ buffers/cache 提供的内存使用量会更加准确些,Linux 会把暂时用不上的内存用作缓存,一旦应用需要的时候就立刻重新分配给它,所以部分被用作缓存的内存其实也算是空闲的内存,为了解释这一点, 甚至有人专门建了个网站: linuxatemyram,您如果还是不理解的话,可以去“充充电”。如果你在 Linux 上安装了 ZFS,这一点会变得更加困惑,因为 ZFS 它自己的文件系统缓存不算入free -m,有时候发现系统已经没有多少空闲内存可用了,其实内存却都待在 ZFS 的缓存里。
8. sar -n DEV 1
$ sar -n DEV 1Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU) 12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00 12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00 12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00 12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00 12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 ^C
这个工具可以被用来检查网络接口的吞吐量:rxkB/s 和 txkB/s,以及是否达到限额,上面的例子中,eth0 接收的流量达到 22Mbytes/s,也即 176Mbits/sec(限额是 1Gbit/sec),我们所用的命令版本中还提供了 %ifutil 作为设备使用率(接收和发送的最大值)的指标,我们也可以用 Brendan 的 nicstat 工具计量这个值,一如 nicstat,sar 显示的这个值是很难精确取得的,在这个例子里面,它就没在正常的工作(显示0.00)。
9. sar -n TCP,ETCP 1
$ sar -n TCP,ETCP 1Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU) 12:17:19 AM active/s passive/s iseg/s oseg/s 12:17:20 AM 1.00 0.00 10233.00 18846.00 12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s 12:17:20 AM 0.00 0.00 0.00 0.00 0.00 12:17:20 AM active/s passive/s iseg/s oseg/s 12:17:21 AM 1.00 0.00 8359.00 6039.00 12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s 12:17:21 AM 0.00 0.00 0.00 0.00 0.00 ^C
这是一些关键的 TCP 指标的汇总视图,这些包括:
active/s:每秒本地发起 TCP 连接数(例如,通过 connect())。 passive/s:每秒远程发起的 TCP 连接数(例如,通过 accept())。 retrans/s:每秒重传 TCP 次数。
active 和 passive 的连接数往往对于描述一个粗略衡量服务器负载是非常有用的:新接受的连接数(passive),下行连接数(active),也可以理解为 active 连接是对外的,而 passive 连接是对内的,虽然严格来说并不完全正确(例如,一个 localhost 到 localhost 的连接),重传是出现一个网络和服务器问题的一个征兆,其可能是由于一个不可靠的网络(例如,公网)造成的,或许也有可能是由于服务器过载并丢包。上面的例子显示了每秒只有一个新的 TCP 连接。
10. top
$ toptop - 00:15:40 up 21:56, 1 user, load average: 31.09, 29.87, 29.92 Tasks: 871 total, 1 running, 868 sleeping, 0 stopped, 2 zombie %Cpu(s): 96.8 us, 0.4 sy, 0.0 ni, 2.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem: 25190241+total, 24921688 used, 22698073+free, 60448 buffers KiB Swap: 0 total, 0 used, 0 free. 554208 cached Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20248 root 20 0 0.227t 0.012t 18748 S 3090 5.2 29812:58 java 4213 root 20 0 2722544 64640 44232 S 23.5 0.0 233:35.37 mesos-slave 66128 titancl+ 20 0 24344 2332 1172 R 1.0 0.0 0:00.07 top 5235 root 20 0 38.227g 547004 49996 S 0.7 0.2 2:02.74 java 4299 root 20 0 20.015g 2.682g 16836 S 0.3 1.1 33:14.42 java 1 root 20 0 33620 2920 1496 S 0.0 0.0 0:03.82 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:05.35 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 6 root 20 0 0 0 0 S 0.0 0.0 0:06.94 kworker/u256:0 8 root 20 0 0 0 0 S 0.0 0.0 2:38.05 rcu_sched
top 命令包含了很多我们之前已经检查过的指标,我们可以观察到命令输出的结果每时每刻都有很大不同,这表明负载是可变的,top 的一个缺点是,很难看到数据随时间变动的趋势,而vmstat 和 pidstat则能提供滚动输出,这样显得更清楚一些,同样的,如果你不以足够快的速度暂停输出以上信息(Ctrl-S 暂停,Ctrl-Q 继续),一些间歇性问题的线索就可能由于被清屏而丢失。
综上所述,通过本文中介绍的快速遥测技巧,我们可以更加高效地诊断和解决Linux系统的性能问题。当出现问题时,我们可以快速地排查,在最短的时间内找到关键点并进行调试,从而提高工作效率和用户体验。
以上が高速テレメトリー、手間のかからない Linux パフォーマンス分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。