DUICUO

オープンソースツールを使用した Linux パフォーマンスのボトルネックの特定

[[404232]]

つい最近まで、ハードウェアのボトルネックを特定するには深い専門知識が必要でした。しかし、今日のオープンソースのGUIパフォーマンスモニターを使えば、かなり簡単に特定できます。

コンピュータは統合システムであり、そのパフォーマンスは最も遅いハードウェアコンポーネントに依存します。あるコンポーネントが他のコンポーネントよりも性能が劣り、パフォーマンスが遅れると、システム全体の速度が低下します。これがパフォーマンスのボトルネックです。深刻なボトルネックを解消することで、システムを高速化できます。

この記事では、Linuxシステムにおけるハードウェアのボトルネックを特定する方法について説明します。これらの手法は、パーソナルコンピュータとサーバーの両方に当てはまります。ここではパーソナルコンピュータに焦点を当てており、LAN管理やデータベースシステムといったサーバー固有のボトルネックについては取り上げません。これらの分野では、通常、専用のツールが必要になります。

解決策についてはあまり詳しく説明しません。この記事では範囲が広すぎるため、代わりにパフォーマンスチューニングに関する続編の記事を書く予定です。

このタスクを実行するために、オープンソースのグラフィカルユーザーインターフェース(GUI)ツールのみを使用します。Linuxのボトルネックに関する記事の多くは非常に複雑で、特殊なコマンドを使用し、難解な詳細まで掘り下げています。

オープンソースのGUIツールを使えば、多くのボトルネックを簡単に特定できます。私の目標は、どこでも使える、迅速でシンプルな方法を提供することです。

どこから始めましょうか?

コンピューターは 6 つの主要なハードウェア リソースで構成されています。

  • プロセッサ
  • メモリ
  • メモリ
  • USBポート
  • インターネット接続
  • グラフィックプロセッサ

これらのリソースのいずれかのパフォーマンスが低下すると、パフォーマンスのボトルネックが発生します。ボトルネックを特定するには、これら6つのリソースを監視する必要があります。

オープンソースには、このタスクを実行するための豊富なツールが用意されています。私ならGNOMEシステムモニターを使います。出力は分かりやすく、ほとんどのソフトウェアリポジトリで見つけることができます。

起動して「リソース」タブをクリックしてください。多くのパフォーマンスの問題がすぐに見つかります。

図1. システムモニターが問題を検出しました。(Howard Fosdick, CC BY-SA 4.0)

「リソース」パネルには、CPU履歴、メモリとスワップ履歴、ネットワーク履歴の3つのセクションが表示されます。これにより、プロセッサが過負荷になっているか、コンピュータのメモリが不足しているか、ネットワーク帯域幅が使い果たされているかをすぐに確認できます。

これらの問題については、以下で詳しく説明します。さて、コンピューターの速度が低下したら、まずシステムモニターを確認してください。システムモニターは、最も一般的なパフォーマンスの問題に関する手がかりをすぐに提供してくれます。

それでは、特定の領域におけるボトルネックを特定する方法を検討してみましょう。

プロセッサのボトルネックを特定する方法

ボトルネックを特定するには、まず使用しているハードウェアを把握する必要があります。オープンソースには、この目的のためのツールがいくつかあります。HardInfoは画面表示が読みやすく、広く普及しているため、気に入っています。

HardInfoを起動します。「コンピューター -> 概要」パネルでCPUを識別し、コア数、スレッド数、速度を確認できます。また、マザーボードやその他のコンピューターコンポーネントも識別できます。

図2. HardInfoはハードウェアの詳細を表示します。(Howard Fosdick, CC BY-SA 4.0)

HardInfo によると、このコンピュータには物理 CPU チップが 1 つ搭載されています。このチップには 2 つのプロセッサ(コア)が搭載されており、各コアは 2 つのスレッド(論理プロセッサ)をサポートします。つまり、論理プロセッサは合計 4 つになります。これは、図 1 のシステム モニターの CPU 履歴セクションに表示されている内容と全く同じです。

プロセッサのボトルネックは、プロセッサが割り当てられた時間内に要求に応答できない場合に発生し、プロセッサがすでに過負荷になっていることを示します。

システムモニターでロジックプロセッサの使用率が常に80%または90%を超えていることが確認できれば、この状態が確認できます。例えば、4つのロジックプロセッサのうち3つが100%の使用率で過負荷状態にあるとします。これは、他のタスクに使用できるCPUリソースが十分に残っていないため、ボトルネック状態です。

図3. プロセッサのボトルネック。(Howard Fosdick, CC BY-SA 4.0)

この問題の原因となったのはどのプログラムですか?

どのプログラムがCPUを大量に消費しているのかを確認する必要があります。システムモニターの「プロセス」タブをクリックします。次に「CPU使用率」という見出しをクリックし、CPU消費量の多い順にプロセスを並べ替えます。どのアプリケーションがシステムの処理能力を低下させているのかが分かります。

図4. 違反を特定するプロセス。(Howard Fosdick, CC BY-SA 4.0)

最初の3つのプロセスはそれぞれCPUリソース全体の24%を消費しました。論理プロセッサは4つあるため、各プロセスが1つのプロセッサ全体を消費したことになります。これは図3に示されています。

「プロセス」パネルでは、「analytical_AI」というプログラムが原因として特定されています。パネル内でこのプログラムを右クリックすると、メモリ使用量、開いているファイル、入出力情報など、リソース消費に関する詳細情報を確認できます。

ログインセッションに管理者権限がある場合は、このプロセスを管理できます。優先度の変更、停止、続行、終了、強制終了などが可能です。そのため、ボトルネックの問題をすぐに解決できます。

図5. プロセスを右クリックして管理します。(Howard Fosdick, CC BY-SA 4.0)

ボトルネックの問題はどうすれば解決できるでしょうか?問題のあるプロセスをリアルタイムで管理するだけでなく、そもそもボトルネックの発生を防ぐこともできます。例えば、問題のあるプロセスを別のアプリケーションに置き換えたり、バイパスしたり、そのアプリケーションの使用状況を変更したり、オフピーク時にスケジュールを設定したり、潜在的なメモリ問題に対処したり、アプリケーションまたはシステムソフトウェアのパフォーマンスチューニングを実行したり、ハードウェアをアップグレードしたりすることができます。ここで網羅するには多すぎるため、これらの方法については次回の記事で詳しく取り上げます。

一般的なプロセッサのボトルネック

システム モニターを使用して CPU を監視する場合、いくつかの一般的なボトルネックの問題が発生する可能性があります。

場合によっては、1つの論理プロセッサがボトルネックとなり、他のすべてのプロセッサが十分に活用されていないことがあります。これは、複数の論理プロセッサを活用できるほどスマートではないアプリケーションのコードがあり、すでに使用しているプロセッサを使い果たしていることを意味します。このアプリケーションは、より多くのプロセッサを使用する場合よりも完了に時間がかかります。しかし、少なくとも他のプロセッサは解放され、コンピューターを圧迫することなく、他の作業を行うことができます。

論理プロセッサの使用率が100%で永続的に停止している場合もあります。これは、非常にビジー状態であるか、プロセスが一時停止状態になっているかのいずれかです。一時停止状態かどうかを確認するには、プロセスがディスクアクティビティを一切実行していないかどうかを確認します(システムモニターの「プロセス」パネルで確認できます)。

最後に、すべてのプロセッサがボトルネックになっている場合、メモリもフルに使用されていることに気付くかもしれません。メモリ不足はプロセッサのボトルネックを引き起こすことがあります。この場合、症状として現れているCPUの問題ではなく、根本的なメモリの問題に対処する必要があります。

メモリのボトルネックを特定する方法

最近のPCはメモリ容量が豊富なため、メモリボトルネックは以前に比べて大幅に減少しています。しかし、メモリを大量に消費するプログラムを実行する場合、特にコンピューターのランダムアクセスメモリ(RAM)が少ない場合は、依然としてこうした問題が発生する可能性があります。

Linuxは、プログラムとディスクデータのキャッシュの両方にメモリを使用します。後者はディスクデータへのアクセスを高速化します。Linuxは、プログラムが必要に応じていつでもこのメモリを再利用することができます。

システムモニターの「リソース」パネルには、メモリの総量と使用状況が表示されます。「プロセス」パネルでは、個々のプロセスのメモリ使用量を確認できます。

以下は、システム モニターの「リソース」パネルで合計メモリ使用量を追跡するセクションです。

図6. メモリボトルネック。(Howard Fosdick, CC BY-SA 4.0)

「メモリ」の右側にスワップ領域があります。これは、メモリ不足時にLinuxが使用するディスク領域です。Linuxはメモリをディスクに書き込んで処理を続行するため、スワップ領域は実質的にメモリの低速な拡張として使用されます。

注意する必要がある 2 つのメモリ パフォーマンスの問題は次のとおりです。

  1. メモリが大量に使用されており、スワップ スペースでのアクティビティが頻繁に発生したり、増加したりしています。
  2. メモリとスワップ領域の両方が大量に使用されています。

シナリオ1では、スワップ領域は常にメモリよりも遅いため、パフォーマンスが低下する可能性があります。これをパフォーマンスの問題と見なすかどうかは、多くの要因(スワップ領域の使用状況、速度、期待値など)によって異なります。私の見解では、現代のPCでは、シンボリックな制限を超えるスワップ領域の使用は許容されません。

シナリオ2は、メモリとスワップ領域の両方が過度に使用されている状況を指します。これはメモリボトルネックです。コンピュータの動作が遅くなり、メモリ管理以外のタスクをほとんど実行できない「轟音」状態になることもあります。

上の図6は、RAMが2GBしかない古いコンピュータを示しています。メモリ使用率が80%を超えると、システムはスワップ領域への書き込みを開始し、応答速度が低下します。このスクリーンショットでは、メモリ使用率が90%を超えており、コンピュータは使用できなくなっています。

メモリ問題の究極の解決策は、メモリ使用量を減らすか、メモリを増設するかのどちらかです。これらの解決策については、別の記事で詳しく説明します。

ストレージのボトルネックを特定する方法

今日のストレージオプションには、ソリッドステートドライブ(SSD)とハードディスクドライブ(HDD)があります。デバイスインターフェースには、PCIe、SATA、Thunderbolt、USBなどがあります。ストレージの種類に関わらず、ディスクのボトルネックを特定するには同じ手順を使用する必要があります。

システムモニターから始めましょう。「プロセス」パネルには、各プロセスの入出力速度が表示されます。そのため、どのプロセスが最も多くのディスクI/Oを実行しているかをすぐに特定できます。

ただし、このツールでは各ディスクの合計データ転送速度は表示されません。特定のディスクがストレージのボトルネックになっているかどうかを判断するには、そのディスクの合計負荷を確認する必要があります。

これを行うには、「atop」コマンドを使用します。これはほとんどのLinuxソフトウェアリポジトリで利用可能です。

コマンドプロンプトでatopと入力するだけです。以下の出力は、デバイスsdb busy 101%であることを示しています。明らかにパフォーマンス限界に達しており、システムがタスクを完了する速度が制限されています。

図7. atopコマンドはディスクのボトルネックを特定しました。(Howard Fosdick, CC BY-SA 4.0)

CPUの1つが、ディスクの処理完了を待つために85%の時間を費やしていることに注目してください( cpu001 w 85% )。これはストレージがボトルネックになる典型的な例です。実際、多くの人はストレージのボトルネックを特定する際に、まずCPUのI/Oレイテンシに注目します。

したがって、ストレージのボトルネックを簡単に特定するには、 atopコマンドを使用します。その後、システムモニターの「プロセス」パネルを使用して、ボトルネックの原因となっている個々のプロセスを特定します。

USBポートのボトルネックを特定する方法

USBポートを一日中使っている人もいます。しかし、これらのポートが最適に使用されているかどうかを確認したことがない人もいます。外付けハードドライブ、USBフラッシュドライブ、その他何でも接続する場合でも、USB接続デバイスから最高のパフォーマンスを得られるようにする必要があります。

このグラフはその理由を示しています。USBデータ転送速度は大きく異なります。

図8. USB速度は大きく異なります。(Howard Fosdick、TrippliteとWikipediaの図に基づく、CC BY-SA 4.0)

HardInfoの「USBデバイス」ラベルには、お使いのコンピュータがサポートしているUSB規格が表示されています。ほとんどのコンピュータは複数の速度に対応しています。特定のポートの速度はどうすればわかるのでしょうか?ベンダーは表に示すようにポートを色分けしています。または、コンピュータのマニュアルで確認することもできます。

実際の速度を確認するには、オープンソースのGNOME Diskプログラムを使ってテストできます。GNOME Diskを起動し、「ディスクベンチマーク」機能を選択してベンチマークテストを実行するだけです。これにより、特定のデバイスをポートに接続した際に実際に得られる最大速度がわかります。

接続するデバイスによっては、ポートの転送速度が異なる場合があります。データ転送速度は、ポートとデバイスの特定の組み合わせによって異なります。

例えば、3.1 の速度で動作可能なデバイスを 2.0 ポートに接続すると、2.0 の速度で動作します(しかも、速度が遅いというメッセージは表示されません)。逆に、USB 2.0 デバイスを 3.1 ポートに接続すると、2.0 の速度で動作します。つまり、高速 USB を実現するには、ポートとデバイスの両方が高速 USB をサポートしていることを確認する必要があります。GNOME Disks では、これを確認するための手段を提供しています。

USB処理のボトルネックを特定するには、SSDやハードドライブの場合と同じ手順を使用します。 atopコマンドを実行してUSBストレージのボトルネックを検出します。次に、システムモニターを使用して、問題のあるプロセスに関する詳細情報を取得します。

インターネット帯域幅のボトルネックを特定する方法

システム モニターの「リソース」パネルには、インターネット接続速度がリアルタイムで表示されます (図 1 を参照)。

最大インターネット速度をテストするための優れたPythonツールがありますが、Speedtest、Fast.com、Speakeasyなどのウェブサイトでもテストできます。最良の結果を得るには、すべての電源をオフにして速度テストのみを実行し、VPNを無効にし、一日の異なる時間帯にテストを実行し、複数のテストウェブサイトの結果を比較してください。

次に、結果をプロバイダーが謳うダウンロード速度とアップロード速度と比較します。これにより、支払った料金に見合った速度が得られていることを確認できます。

別途ルーターをお持ちの場合は、ルーターの有無でテストしてください。これにより、ルーターがボトルネックになっているかどうかがわかります。Wi-Fiをご利用の場合は、Wi-Fiの有無でテストしてください(ノートパソコンをモデムに直接接続してください)。インターネットプロバイダーに不満を言う人が、実際にはWi-Fiのボトルネックで、自分で解決できる場合が多いです。

何らかのプログラムがインターネット接続全体を消費していて、それがどれなのかを知りたい場合は、 nethogsコマンドを使って調べてください。このコマンドはほとんどのソフトウェアリポジトリで利用可能です。

ある日、システムモニターに突然インターネットトラフィックの急増が表示されました。コマンドラインにnethogsと入力するだけで、帯域幅を浪費しているのはClamavアンチウイルスのアップデートだとすぐに判断されました。

図9. Nethogsは帯域幅ユーザーを識別します。(Howard Fosdick, CC BY-SA 4.0)

グラフィックス処理のボトルネックを特定する方法

デスクトップパソコンの背面にあるマザーボードにモニターを接続する場合は、オンボードグラフィックカードを使用します。背面にある別のカードに接続する場合は、専用のグラフィックサブシステムを使用します。多くの人はこれをビデオカードまたはグラフィックカードと呼びます。デスクトップパソコンの場合、外付けグラフィックカードは通常、マザーボードに搭載されているものよりも強力で高価です。ノートパソコンでは、常にオンボードグラフィックカードが使用されます。

HardInfoの「PCIデバイス」パネルでは、グラフィック処理装置(GPU)に関する情報を確認できます。また、専用ビデオメモリの容量も表示されます(「プリフェッチ可能」と表示されているメモリを探してください)。

図10. HardInfoはグラフィックス処理情報を提供します。(Howard Fosdick, CC BY-SA 4.0)

CPUとGPUは非常に密接に連携して動作します。つまり、CPUはGPUがレンダリングするためのフレームを準備し、GPUはそれらのフレームをレンダリングします。

GPU ボトルネックは、 CPU が 100% ビジー状態の GPU を待機しているときに発生します。

これを判断するには、CPUとGPUの使用率を監視する必要があります。ConkyやGlancesなどのオープンソースモニターは、拡張機能がグラフィックチップセットをサポートしていれば、これを実行できます。

Conkyの例を見てみましょう。このシステムには多くのCPUが利用可能であることがわかります。GPUの使用率はわずか25%です。もしGPUの使用率が100%に近づいたらどうなるでしょうか。そうすると、CPUがGPUを待機していることがわかり、GPUボトルネックが発生します。

図11. ConkyはCPUとGPUの使用率を表示します。(画像出典: AskUbuntuフォーラム)

一部のシステムでは、GPUを監視するためにベンダー固有のツールが必要になる場合があります。これらのツールはGitHubからダウンロードでき、「GPU監視および診断コマンドラインツール」の記事で説明されています。

要約

コンピューターは、統合された一連のハードウェアリソースで構成されています。そのうちの1つでも、ワークロードの点で他のリソースよりも大幅に遅れると、パフォーマンスのボトルネックが発生します。これはシステム全体のパフォーマンスを低下させる可能性があります。最適なパフォーマンスを実現するには、ボトルネックを特定し、修正する必要があります。

つい最近まで、ボトルネックを特定するには深い専門知識が必要でした。しかし、今日のオープンソースのGUIパフォーマンスモニターにより、ボトルネックの特定は大幅に簡素化されました。