パフォーマンスチューニングガイド
Red Hat Enterprise Linux 7 でサブシステムの処理能力を最適化する
概要
注記
第1章 はじめに
- 設定前のバックアップ
- Red Hat Enterprise Linux 7 のデフォルト設定は、負荷がそれほど大きくない状態で実行されているほとんどのサービスに適しています。特定のサブシステムのパフォーマンスを向上させると、別のシステムに悪い影響が及ぶことがあります。システムをチューニングする前に、すべてのデータおよび設定情報をバックアップしてください。
- 本番稼働用でない設定のテスト
- 『パフォーマンスチューニングガイド』で示されている手順は Red Hat エンジニアによってラボと現場で入念にテストされていますが、Red Hat は、これらの設定を本番稼働システムに適用する前に、計画されたすべての設定を安全なテスト環境でテストすることをお勧めします。
本書の対象読者
- システム管理者
- 『パフォーマンスチューニングガイド』では、システム管理者が特定の目的のために Red Hat Enterprise Linux 7 を最適化できるよう各設定オプションの効果について詳しく説明します。本書の手順は Red Hat Certified Engineer (RHCE) 認定書または同等の経験 (3〜5 年の Linux ベースシステムのデプロイおよび管理経験) を持つシステム管理者向けです。
- システムおよびビジネスアナリスト
- 本書では、Red Hat Enterprise Linux 7 のパフォーマンス機能について高度な説明をします。特定の負荷でサブシステムのパフォーマンスがどのように変化するかについての情報が提供されるため、アナリストは Red Hat Enterprise Linux 7 が各ユースケースに適しているかどうかを判断できます。可能な場合、『パフォーマンスチューニングガイド』では、読者に詳細なドキュメンテーションが紹介されます。これにより、読者は、インフラストラクチャーとデプロイメントの提案に必要な詳細なデプロイメントおよび最適化ストラテジーを作成するのに必要となる詳しい知識を得ることができます。
第2章 パフォーマンス監視ツール
2.1. /proc
proc 「ファイルシステム」は、Linux カーネルの現在の状態を表すファイル階層で構成されるディレクトリーになります。ユーザーやアプリケーションはこのファイルシステムでシステムのカーネル状態を確認することができます。
proc ディレクトリーには、システムのハードウェアおよび実行中のプロセスに関する情報も格納されています。これらファイルのほとんどは読み取り専用ですが、一部のファイル (主に /proc/sys 内のファイル) はユーザーやアプリケーションが操作することで、設定変更をカーネルに伝達できるものもあります。
proc ディレクトリー内のファイルの表示および編集に関する詳細は『Red Hat Enterprise Linux 7 システム管理者のガイド』 (https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/) を参照してください。
2.2. GNOME システムモニター
- システム
- システムのハードウェアおよびソフトウェアの基本情報を表示します。
- プロセス
- 実行中のプロセスおよびそれらプロセスの関係に関する詳細情報を表示します。表示されたプロセスにフィルターをかけ特定のプロセスを見つけやすくすることができます。また、表示されたプロセスに起動、停止、強制終了、優先順位の変更などの動作を実行することもできます。
- リソース
- 現在の CPU 使用時間、メモリーおよび swap 領域の使用量、ネットワークの使用量を表示します。
- ファイルシステム
- マウントされているファイルシステムの全一覧、ファイルシステムのタイプやマウントポイント、メモリー使用量など各ファイルシステムの基本情報が表示されます。
2.3. Performance Co-Pilot (PCP)
pmcd) は、ホストシステムでパフォーマンスデータを収集します。pminfo や pmstat などのクライアントツールを使用すると、同じホストまたはネットワークを介してこのデータを取得、表示、アーカイブ、および処理できます。pcp パッケージはコマンドラインツールと基礎となる機能を提供します。グラフィカルツールでも pcp-gui パッケージが必要です。
リソース
- PCPIntro という名前の man ページでは、Performance Co-Pilot について紹介しています。利用可能なツールの一覧、利用可能な設定オプションの説明、および関連する man ページの一覧が提供されます。デフォルトでは、包括的なドキュメンテーションは
/usr/share/doc/pcp-doc/ディレクトリーにインストールされます (『Performance Co-Pilot User's and Administrator's Guide』や『Performance Co-Pilot Programmer's Guide』など)。 - PCP については、Red Hat カスタマーポータルの「Index of Performance Co-Pilot (PCP) articles, solutions, tutorials and white papers」を参照してください。
- すでに精通している古いツールの機能がある PCP ツールを調べる必要がある場合は、Red Hat ナレッジベースの記事「Side-by-side comparison of PCP tools with legacy tools」を参照してください。
- Performance Co-Pilot の詳細な説明と使用方法については、「DOCUMENTATION」から公式な PCP ドキュメントを参照してください。Red Hat Enterprise Linux ですぐに PCP を使用する場合は、「PCP Quick Reference Guide」を参照してください。公式な PCP Web サイトには、「FAQ」 (よくある質問の一覧) も含まれます。
2.4. Tuna
$ man tuna
2.5. ビルトインのコマンドラインツール
2.5.1. top
$ man top
2.5.2. ps
$ man ps
2.5.3. 仮想メモリーの統計 (vmstat)
$ man vmstat
2.5.4. System Activity Reporter (sar)
-i オプションを使って間隔を秒単位で設定することもできます。sar -i 60 と指定すると sar は CPU の使用量を毎分チェックすることになります。
$ man sar
2.6. perf
2.7. turbostat
- 不変タイムスタンプカウンター
- APERF モデル固有のレジスター
- MPERF モデル固有のレジスター
$ man turbostat
2.8. iostat
await 値とその値が多くなる原因の詳細については、Red Hat ナレッジベースの記事「iostat によって報告される await 値は何を示していますか?」を参照してください。
2.9. irqbalance
$ man irqbalance
2.10. ss
ss -tmpie があります。
$ man ss
2.11. numastat
numa_hit 値と低い numa_miss 値で示されます。Numastat ではシステム内の NUMA ノード全体でシステムおよびプロセスメモリーがどのように分散されているかを表示するコマンドラインオプションも用意されています。
$ man numastat
2.12. numad
/proc ファイルシステム内の情報に定期的にアクセスしてノードごとに使用可能なシステムリソースを監視します。指定されたリソース使用量のレベルを維持、必要に応じて NUMA ノード間でプロセスを移動しリソース割り当てバランスの再調整を行います。システムの NUMA ノードのサブセットで使用量が著しいプロセスを特定し隔離することで最適な NUMA パフォーマンスの実現を目指します。
$ man numad
2.13. SystemTap
2.14. OProfile
- パフォーマンスのモニタリングサンプルが正確ではない場合があります。プロセッサーは順番通りに指示を実行しない場合があるので、割り込みを発生させた指示自体ではなく、近辺の指示からサンプルを記録する可能性があります。
- OProfile はプロセスが複数回にわたって開始、停止することを想定しています。このため、複数の実行からのサンプルの累積が可能です。前回の実行から得たサンプルデータの消去が必要な場合があります。
- アクセスが CPU に限定されているプロセスの問題の特定に特化しているため、他のイベントでロックを待機している間はスリープ状態のプロセスを特定する場合には役に立ちません。
/usr/share/doc/oprofile-version に格納されているドキュメントをご覧いただくこともできます。
2.15. Valgrind
$ man valgrind
/usr/share/doc/valgrind-version にインストールされます。
第3章 Tuned
3.1. Tuned の概要
udev を使用して接続されたデバイスを監視し、選択されたプロファイルに従ってシステム設定を静的および動的にチューニングするデーモンです。Tuned は、高スループット、低レイテンシー、省電力などの一般的なユースケース向けの複数の定義済みプロファイルとともに配布されます。各プロファイル向けに定義されたルールを変更し、特定のデバイスのチューニング方法をカスタマイズできます。特定のプロファイルで行われたシステム設定のすべての変更を元に戻すには、別のプロファイルに切り替えるか、tuned サービスを非アクティブ化します。
注記
no-daemon mode で実行できます (常駐メモリーをまったく必要としません)。このモードでは、tuned は設定を適用し、終了します。このモードでは、D-Bus サポート、ホットプラグサポート、または設定のロールバックサポートを含むたくさんの tuned 機能が使用できないため、no-daemon mode はデフォルで無効になります。no-daemon mode を有効にするには、/etc/tuned/tuned-main.conf ファイルで daemon = 0 を設定します。
sysctl 設定および sysfs 設定の適用と ethtool などの複数の設定ツールのワンショットアクティベーションから構成されます。また、Tuned はシステムコンポーネントの使用を監視し、その監視情報に基いてシステム設定を動的にチューニングします。
/etc/tuned/tuned-main.conf ファイルを編集し、dynamic_tuning フラグを 1 に変更することによって有効にできます。
3.1.1. プラグイン
disk- デバイスおよび測定間隔ごとのディスク負荷 (IO 操作の数) を取得します。
net- ネットワークカードおよび測定間隔ごとのネットワーク負荷 (転送済みパケットの数) を取得します。
load- CPU および測定間隔ごとの CPU 負荷を取得します。
cpu- CPU ガバナーを、
governorパラメーターで指定された値に設定し、CPU 負荷に応じて PM QoS CPU DMA レイテンシーを動的に変更します。CPU 負荷がload_thresholdパラメーターで指定された値よりも小さい場合、レイテンシーはlatency_highパラメーターで指定された値に設定されます。それ以外の場合は、latency_lowで指定された値に設定されます。また、レイテンシーは、特定の値に強制的に設定できます (動的に変更しない場合)。これは、force_latencyパラメーターを必要なレイテンシー値に設定することにより実現できます。 eeepc_she- CPU 負荷に応じて FSB 速度を動的に設定します。この機能は、一部のノートブックに存在し、Asus Super Hybrid Engine とも呼ばれます。CPU 負荷が
load_threshold_powersaveパラメーターで指定された値以下である場合は、プラグインによって FSB 速度がshe_powersaveパラメーターで指定された値に設定されます (FSB 周波数および対応する値の詳細については、カーネルのドキュメントを参照)。CPU 負荷がload_threshold_normalパラメーターで指定された値以上である場合は、FSB 速度がshe_normalパラメーターで指定された値に設定されます。静的チューニングはサポートされず、プラグインは透過的に無効になります (この機能のハードウェアサポートが検出されない場合)。 net- wake-on-lan を
wake_on_lanパラメーターで指定された値に設定します (ethtool ユーティリティーと同じ構文を使用します)。また、インターフェースの使用状況に応じてインターフェース速度が自動的に変更されます。 sysctl- プラグインパラメーターで指定されたさまざまな
sysctl設定を指定します。構文はname=valueとなります。ここで、nameは sysctl ツールにより提供されたものと同じ名前になります。このプラグインは、他のプラグインで指定できない設定を変更する必要がある場合に使用します (ただし、設定を特定のプラグインで指定できる場合は、そのプラグインを使用することが推奨されます)。 usb- USB デバイスの autosuspend タイムアウトを
autosuspendパラメーターで指定された値に設定します。値が 0 の場合は、autosuspend が無効になります。 vmtransparent_hugepagesパラメーターのブール値に応じて Transparent Huge Page を有効または無効にします。audio- 音声コーデックの autosuspend タイムアウトを
timeoutパラメーターで指定された値に設定します。現時点では、snd_hda_intelとsnd_ac97_codecがサポートされてます。値が0の場合は、autosuspend が無効になります。また、ブール値パラメーターreset_controllerをtrueに設定することにより、コントローラーを強制的にリセットすることもできます。 disk- エレベーターを
elevatorパラメーターで指定された値に設定します。また、ALPM をalpmパラメーターで指定された値、ASPM をaspmパラメーターで指定された値、スケジューラークォンタムをscheduler_quantumパラメーターで指定された値、ディスク spindown タイムアウトをspindownパラメーターで指定された値、ディスク readahead をreadaheadパラメーターで指定された値に設定し、現在のディスク readahead 値をreadahead_multiplyパラメーターで指定された定数で乗算できます。さらに、このプラグインにより、現在のドライブ使用状況に応じてドライブの高度な電力管理設定と spindown タイムアウト設定が動的に変更されます。動的チューニングは、ブール値パラメーターdynamicにより制御でき、デフォルトで有効になります。 mountsdisable_barriersパラメーターのブール値に応じてマウントのバリアを有効または無効にします。script- このプラグインは、プロファイルがロードまたはアンロードされたときに実行する外部スクリプトの実行に使用されます。スクリプトは、
startまたはstopのいずれかの引数 (スクリプトがプロファイルのロード時またはアンロード時に呼び出されるかによって決まります) によって呼び出されます。スクリプトファイル名は、scriptパラメーターによって指定できます。スクリプトで停止アクションを正しく実装し、変更したすべての設定を起動アクション中に元に戻す必要がああることに注意してください。このような操作を行わないと、ロールバックが機能しません。ユーザーの利便性のために、functionsBash ヘルパースクリプトがデフォルトでインストールされ、スクリプトで定義されたさまざまな機能をインポートして使用できます。この機能は、主に後方互換性を維持するために提供されます。この機能は最終手段として使用し、必要な設定を指定できる他のプラグインが存在する場合は、そのプラグインを使用することが推奨されます。 sysfs- プラグインパラメーターで指定されたさまざまな
sysfs設定を指定します。構文はname=valueとなります。ここで、nameは、使用する sysfs パスです。このプラグインは、他のプラグインで指定できない設定を変更する必要がある場合に使用します (設定を特定のプラグインで指定できる場合は、そのプラグインを使用することが推奨されます)。 video- ビデオカードのさまざまな省電力レベルを設定します (現時点では、Radeon カードのみがサポートされます)。省電力レベルは
radeon_powersaveパラメーターを使用して指定できます。サポートされる値はdefault、auto、low、mid、high、およびdynpmです。詳細については、http://www.x.org/wiki/RadeonFeature#KMS_Power_Management_Options を参照してください。このプラグインは試験目的で提供され、今後のリリースで変更されることがあることに注意してください。 bootloader- カーネルブートコマンドラインにパラメーターを追加します。このプラグインは grub-legacy パッケージと grub2 パッケージ、さらに Extensible Firmware Interface (EFI) を使用する Grub をサポートします。
grub2_cfg_fileオプションを使用すると、grub2 設定ファイルのカスタマイズされた標準的でない場所を指定できます。これらのパラメーターは、現在の grub 設定とそのテンプレートに追加されます。カーネルパラメーターを有効にするには、マシンを再起動する必要があります。パラメーターは次の構文で指定できます。cmdline=arg1 arg2 ... argn.
3.1.2. インストールと使用方法
yum install tunedthroughput-performance- これは、コンピューターノードとして動作する Fedora オペレーティングシステムで事前に選択されます。このようなシステムの目的は、スループットパフォーマンスの最大化です。
virtual-guest- これは、仮想マシンで事前に選択されます。この目的はパフォーマンスの最大化です。パフォーマンスの最大化に興味がない場合は、
balancedまたはpowersaveプロファイルに変更できます (下記参照)。 balanced- これは、他のすべてのケースで事前に選択されます。この目的は、パフォーマンスと電力消費の調和です。
systemctl start tunedsystemctl enable tunedtuned-adm
tuned-adm listtuned-adm activetuned-adm profile profiletuned-adm profile powersavethroughput-performance プロファイルでディスクに対して high スループットを設定し、同時に spindown-disk プロファイルでディスクスピンダウンを low 値に設定することが挙げられます。以下の例では、仮想マシンでの実行でパフォーマンスを最大化するようシステムが最適化され、同時に、低消費電力を実現するようシステムがチューニングされます (低消費電力が最優先である場合)。
tuned-adm profile virtual-guest powersavetuned-adm recommendtuned --help3.1.3. カスタムプロファイル
/usr/lib/tuned/ ディレクトリーに格納されます。各プロファイルには独自のディレクトリーがあります。プロファイルは tuned.conf という名前の主要設定ファイルとオプションのヘルパースクリプトなどの他のファイルから構成されます。
/etc/tuned/ ディレクトリーにプロファイルディレクトリーをコピーします。同じ名前のプロファイルが 2 つある場合は、/etc/tuned/ に含まれるプロファイルが使用されます。
/etc/tuned/ ディレクトリーで独自のプロファイルを作成して、特定のパラメーターのみが調整、または上書きされた /usr/lib/tuned/ に含まれるプロファイルを使用することもできます。
tuned.conf ファイルには、複数のセクションが含まれます。[main] セクションは 1 つだけ存在します。他のセクションはプラグインインスタンス向けの設定です。[main] セクションを含むすべてのセクションはオプションです。ハッシュ記号 (#) で始まる行はコメントです。
[main] セクションには、以下のオプションがあります。
include=profile- 指定されたプロファイルがインクルードされます。たとえば、
include=powersaveの場合は、powersaveプロファイルがインクルードされます。
[NAME] type=TYPE devices=DEVICES
devices 行には、リスト、ワイルドカード (*)、および否定 (!) を含めることができます。また、ルールを組み合わせることもできます。devices 行がない場合は、TYPE のシステムに存在する、または後で接続されたすべてのデバイスがプラグインインスタンスによって処理されます。これは、devices=* を使用したときと同様です。プラグインのインスタンスが指定されない場合、プラグインは有効になりません。プラグインがさらに多くのオプションをサポートする場合は、プラグインセクションでそれらのプラグインを指定することもできます。オプションが指定されないと、デフォルト値が使用されます (インクルードされたプラグインで以前に指定されていない場合)。プラグインオプションのリストについては、「プラグイン」を参照してください。
例3.1 プラグインインスタンスの定義
sda や sdb などの sd で始まるすべての候補に一致し、それらの候補に対するバリアは無効になりません。
[data_disk] type=disk devices=sd* disable_barriers=false
sda1 と sda2 を除くすべての候補に一致します。
[data_disk] type=disk devices=!sda1, !sda2 disable_barriers=false
[TYPE] devices=DEVICES
type 行を省略することができます。タイプと同様に、インスタンスは名前で参照されます。上記の例は、以下のように書き換えることができます。
[disk] devices=sdb* disable_barriers=false
include オプションを使用して同じセクションが複数回指定された場合は、設定がマージされます。競合のため、設定をマージできない場合は、競合がある以前の設定よりも競合がある最後の定義が優先されます。場合によっては、以前に定義された内容がわからないことがあります。このような場合は、replace ブール値オプションを使用して true に設定できます。これにより、同じ名前の以前の定義がすべて上書きされ、マージは行われません。
enabled=false オプションを指定してプラグインを無効にすることもできます。これは、インスタンスが定義されない場合と同じ効果を持ちます。include オプションから以前の定義を再定義し、カスタムプロファイルでプラグインをアクティブにしない場合は、プラグインを無効にすると便利です。
balanced プロファイルに基づき、すべてのデバイスの ALPM が最大の省電力に設定されるように拡張されたカスタムプロファイルの例を示します。
[main] include=balanced [disk] alpm=min_power
isolcpus=2 をカーネルブートコマンドラインに追加するカスタムプロファイルの例を示します。
[bootloader] cmdline=isolcpus=2
3.1.4. Tuned-adm
tuned-adm ユーティリティーで簡単にアクティベートできる一般的なユースケース向けの定義済みプロファイルが複数含まれます。プロファイルを作成、変更、および削除することも可能です。
tuned-adm listtuned-adm activetuned-adm profile profile_nametuned-adm profile latency-performancetuned-adm offbalanced- デフォルトの省電力プロファイル。パフォーマンスと電力消費のバランスを取ることが目的です。可能な限り、自動スケーリングと自動チューニングを使用しようとします。ほとんどの負荷で良い結果をもたらします。唯一の欠点はレイテンシーが増加することです。現在の tuned リリースでは、CPU、ディスク、音声、および動画のプラグインが有効になり、
ondemandガバナーがアクティブ化されます。radeon_powersaveはautoに設定されます。 powersave- 省電力パフォーマンスを最大化するプロファイル。実際の電力消費を最小化するためにパフォーマンスを調整できます。現在の tuned リリースでは、USB 自動サスペンド、WiFi 省電力、および SATA ホストアダプター向けの ALPM 省電力が有効になります。また、ウェイクアップ率が低いシステムのマルチコア省電力がスケジュールされ、
ondemandガバナーがアクティブ化されます。さらに、AC97 音声省電力と、システムに応じて HDA-Intel 省電力 (10 秒のタイムアウト) が有効になります。KMS が有効なサポート対象 Radeon グラフィックカードがシステムに搭載されている場合は、自動省電力に設定されます。Asus Eee PC では、動的な Super Hybrid Engine が有効になります。注記
powersaveプロファイルは、必ずしも最も効率的ではありません。定義された量の作業を行う場合 (たとえば、動画ファイルをトランスコードする必要がある場合) を考えてください。トランスコードがフルパワーで実行される場合に、マシンが少ない電力を消費することがあります。これは、タスクがすぐに完了し、マシンがアイドル状態になり、非常に効率的な省電力モードに自動的に切り替わることがあるためです。その一方で、調整されたマシンでファイルをトランスコードすると、マシンはトランスコード中に少ない電力を消費しますが、処理に時間がかかり、全体的な消費電力は高くなることがあります。このため、一般的にbalancedプロファイルが優れたオプションになる場合があります。 throughput-performance- 高スループットに最適化されたサーバープロファイル。省電力メカニズムが無効になり、ディスクとネットワーク IO のスループットパフォーマンスを向上させる sysctl 設定が有効になり、
deadlineスケジューラーに切り替わります。CPU ガバナーはperformanceに設定されます。 latency-performance- 低レイテンシーに最適化されたサーバープロファイル。省電力メカニズムが無効になり、レイテンシーを向上させる sysctl 設定が有効になります。CPU ガバナーは
performanceに設定され、CPU は低い C 状態にロックされます (PM QoS を使用)。 network-latency- 低レイテンシーネットワークチューニング向けプロファイル。
latency-performanceプロファイルに基づきます。また、透過的な巨大ページと NUMA 調整が無効になり、複数の他のネットワーク関連の sysctl パラメーターがチューニングされます。 network-throughput- スループットネットワークチューニング向けプロファイル。
throughput-performanceプロファイルに基づきます。また、カーネルネットワークバッファーが増加されます。 virtual-guest- enterprise-storage プロファイルに基づく仮想ゲスト向けプロファイル。仮想メモリーの swappiness の減少やディスクの readahead 値の増加などが行われます。ディスクバリアは無効になりません。
virtual-hostenterprise-storageプロファイルに基づく仮想ホスト向けプロファイル。仮想メモリーの swappiness の減少、ディスクの readahead 値の増加、ダーティーページのアグレッシブライトバックの有効化などが行われます。oracle- Oracle データベース向けに最適化されたプロファイルは、
throughput-performanceプロファイルに基づいてロードされます。これにより Transparent Huge Page が無効になり、一部の他のパフォーマンス関連カーネルパラメーターが変更されます。このプロファイルは、tuned-profiles-oracle パッケージにより提供され、Red Hat Enterprise Linux 6.8 以降で利用可能です。 desktopbalancedプロファイルに基づく、デスクトップに最適化されたプロファイル。対話型アプリケーションの応答を向上させるためにスケジューラーオートグループが有効になります。
注記
Optional チャネルで利用可能な tuned-profiles-compat パッケージでインストールできます。これらのプロファイルは、後方互換性を維持するために提供され、開発は行われていません。基本パッケージの一般的なプロファイルを使用すると、ほとんどの場合、同等のことやそれ以外のことも行えます。特別な理由がない限り、基本パッケージのプロファイルを使用することが推奨されます。互換プロファイルは以下のとおりです。
default- これは利用可能なプロファイルの中で省電力への影響度が最も低く、tuned の CPU プラグインとディスクプラグインのみが有効になります。
desktop-powersave- デスクトップシステム向けの節電プロファイル。SATA ホストアダプター用の ALPM 節電と tuned の CPU、イーサネット、およびディスクのプラグインを有効にします。
laptop-ac-powersave- AC 電源で稼働するノートパソコン向け省電力プロファイル (影響度は中)。SATA ホストアダプター用の ALPM 省電力、WiFi 省電力、および tuned の CPU、イーサネット、ディスクのプラグインが有効になります。
laptop-battery-powersave- バッテリーで稼働するラップトップ向け省電力プロファイル (影響度は大)。現在の tuned 実装では、
powersaveプロファイルのエイリアスになります。 spindown-disk- スピンダウン時間を最大化する、従来の HDD が搭載されたマシン向け省電力プロファイル。tuned 省電力メカニズム、USB 自動サスペンド、および Bluetooth が無効になり、Wi-Fi 省電力が有効になり、ログ同期が無効になり、ディスクライトバック時間が増加し、ディスクの swappiness が減少します。すべてのパーティションは、
noatimeオプションを使用して再マウントされます。 enterprise-storage- I/O スループットを最大化する、エンタープライズ級のストレージ向けサーバープロファイル。
throughput-performanceプロファイルと同じ設定がアクティブ化され、readahead 設定値が乗算され、ルートパーティションと起動パーティション以外のパーティションでバリアが無効になります。
注記
atomic-host プロファイル、仮想マシンで atomic-guest プロファイルを使用します。
yum install tuned-profiles-atomicatomic-host- Red Hat Enterprise Linux Atomic Host 向けに最適化されたプロファイル。ベアメタルサーバーでホストシステムとして使用する場合は、throughput-performance プロファイルを使用します。さらに、SELinux AVC キャッシュと PID 制限が増加し、netfilter 接続追跡がチューニングされます。
atomic-guest- Red Hat Enterprise Linux Atomic Host 向けに最適化されたプロファイル (virtual-guest プロファイルに基づいてゲストシステムとして使用される場合)。SELinux AVC キャッシュと PID 制限が増加し、netfilter 接続追跡がチューニングされます。
注記
realtime、realtime-virtual-host、および realtime-virtual-guest) が利用可能です。
realtime プロファイルを有効にするには、tuned-profiles-realtime パッケージをインストールします。root で次のコマンドを実行します。
yum install tuned-profiles-realtimerealtime-virtual-host プロファイルと realtime-virtual-guest プロファイルを有効にするには、tuned-profiles-nfv パッケージをインストールします。root で次のコマンドを実行します。
yum install tuned-profiles-nfv3.1.5. Powertop2tuned
yum install tuned-utilspowertop2tuned new_profile_name/etc/tuned ディレクトリー内にプロファイルが作成されます。安全上の理由から、すべての PowerTOP チューニングは最初に新しいプロファイルで無効になっています。これらのチューニングを有効にするには、/etc/tuned/profile/tuned.conf で興味があるチューニングをコメント解除します。--enable または -e オプションを使用して、有効な PowerTOP により提示されたほとんどのチューニングで新しいプロファイルを生成できます。USB 自動サスペンドなどの一部の危険なチューニングは引き続き無効になります。これらのチューニングが必要な場合は、手動でコメント解除する必要があります。デフォルトでは、新しいプロファイルはアクティブ化されません。アクティブ化するには、以下のコマンドを実行します。
tuned-adm profile new_profile_namepowertop2tuned --help3.2. tuned と tuned-adm によるパフォーマンスチューニング
tuned プロファイルの概要
throughput-performance です。
- ストレージおよびネットワークに対して少ない待ち時間
- ストレージおよびネットワークの高い処理能力
- 仮想マシンのパフォーマンス
- 仮想化ホストのパフォーマンス
tuned ブートローダープラグイン
tuned Bootloader plug-in を使用すると、パラメーターをカーネル (ブートまたは dracut) コマンドラインに追加できます。GRUB 2 ブートローダーのみがサポートされ、プロファイルの変更を適用するには再起動が必要なことに注意してください。たとえば、quiet パラメーターを tuned プロファイルに追加するには、tuned.conf ファイルに次の行を含めます。
[bootloader] cmdline=quiet別のプロファイルに切り替えると、追加パラメーターが削除されます。tuned を停止した場合、パラメーターは
grub.cfg ファイルで永続化されます。
環境変数と展開 tuned 組み込み関数
tuned-adm profile profile_name と grub2-mkconfig -o profile_path を実行すると、Bash 環境変数を使用できます。Bash 環境変数は grub2-mkconfig の実行後に展開されます。たとえば、次の環境変数は nfsroot=/root に展開されます。
[bootloader] cmdline="nfsroot=$HOME"
tuned 変数を使用できます。次の例では、${isolated_cores} は 1,2 に展開され、カーネルは isolcpus=1,2 パラメーターで起動します。
[variables]
isolated_cores=1,2
[bootloader]
cmdline=isolcpus=${isolated_cores}${non_isolated_cores} は 0,3-5 に展開され、cpulist_invert 組み込み関数が 0,3-5 引数で呼び出されます。
[variables]
non_isolated_cores=0,3-5
[bootloader]
cmdline=isolcpus=${f:cpulist_invert:${non_isolated_cores}}cpulist_invert 関数は CPU の一覧を反転します。6 CPU のマシンでは、反転が 1,2 になり、カーネルは isolcpus=1,2 コマンドラインパラメーターで起動されます。
tuned.conf に追加できます。
[variables]
include=/etc/tuned/my-variables.conf
[bootloader]
cmdline=isolcpus=${isolated_cores}
isolated_cores=1,2 を /etc/tuned/my-variables.conf ファイルに追加する場合、カーネルは isolcpus=1,2 パラメーターで起動されます。
デフォルトのシステム tuned プロファイルの変更
手順3.1 新しい tuned プロファイルディレクトリーの作成
/etc/tuned/で、作成するプロファイルと同じ名前の新しいディレクトリーを作成します (/etc/tuned/my_profile_name/)。- 新しいディレクトリーで、
tuned.confという名前のファイルを作成し、次の行を先頭に含めます。[main] include=profile_name
- プロファイルの変更を含めます。たとえば、
vm.swappinessの値がデフォルトの 10 ではなく 5 に設定された状態で、throughput-performanceプロファイルから設定を使用するには、次の行を含めます。[main] include=throughput-performance [sysctl] vm.swappiness=5
- プロファイルをアクティベートするには、次のコマンドを実行します。
# tuned-adm profile my_profile_name
tuned.conf ファイルとともにディレクトリーを作成すると、システム tuned プロファイルの更新後にすべてのプロファイルの変更を保持できます。
/user/lib/tuned/ から /etc/tuned/ にコピーします。以下に例を示します。
# cp -r /usr/lib/tuned/throughput-performance /etc/tuned
/etc/tuned でプロファイルを編集します。同じ名前のプロファイルが 2 つある場合は、/etc/tuned/ にあるプロファイルがロードされることに注意してください。この方法の欠点は、tuned のアップグレード後にシステムプロファイルが更新される場合に、古くなった変更済みバージョンに変更が反映されなくなることです。
リソース
第4章 CPU
4.1. 留意事項
- プロセッサー同士およびメモリーなど関連リソースとの接続形態
- プロセッサーによる実行用スレッドのスケジュール方式
- Red Hat Enterprise Linux 7 でのプロセッサーによる割り込み処理の方法
4.1.1. システムのトポロジー
- Symmetric Multi-Processor (SMP) トポロジー
- SMP トポロジーの場合、すべてのプロセッサーが同じ時間量メモリーにアクセスすることができます。ただし、メモリーアクセスへの平等な共有は本質的に全 CPU からのメモリーアクセスを直列化することになるため、SMP システムでのスケーリングにおける制約が全般的に許容できないレベルと見られるようになってきました。こうした状況のため実際には最近のサーバーシステムではすべて NUMA マシンが使われています。
- Non-Uniform Memory Access (NUMA) トポロジー
- NUMA トポロジーは SMP トポロジーより後に開発されました。NUMA システムでは複数のプロセッサーがひとつのソケット上で物理的にまとめられています。各ソケットにはメモリー専用の領域があり、メモリーへのローカルアクセスがある複数のプロセッサーをまとめてひとつのノードと呼んでいます。同じノードのプロセッサーはそのノードのメモリーバンクへは高速でアクセスでき、別のノードのメモリーバンクへのアクセスは低速になります。したがってローカルメモリー以外へアクセスする場合にはパフォーマンスが低下します。この点を考慮するとパフォーマンス重視のアプリケーションは NUMA トポロジーの場合アプリケーションを実行しているプロセッサーと同じノードにあるメモリーにアクセスさせるようにして、できるだけリモートのメモリーへのアクセスは避けるようにします。NUMA トポロジーのシステムでアプリケーションのパフォーマンスを調整する場合、アプリケーションが実行される場所そして実行ポイントに最も近いメモリーバンクはどれになるのかを考慮しておくことが重要となります。NUMA トポロジーのシステムの場合、プロセッサー、メモリー、周辺デバイスの接続形態に関する情報は
/sysファイルシステムに格納されています。/sys/devices/system/cpuディレクトリーにはプロセッサー同士の接続形態に関する詳細が格納されています。/sys/devices/system/nodeディレクトリーには NUMA ノードおよびノード間の相対距離に関する情報が格納されています。
4.1.1.1. システムのトポロジーを確認する
numactl --hardware コマンドを使用するとシステムのトポロジーの概要が表示されます。
$ numactl --hardware available: 4 nodes (0-3) node 0 cpus: 0 4 8 12 16 20 24 28 32 36 node 0 size: 65415 MB node 0 free: 43971 MB node 1 cpus: 2 6 10 14 18 22 26 30 34 38 node 1 size: 65536 MB node 1 free: 44321 MB node 2 cpus: 1 5 9 13 17 21 25 29 33 37 node 2 size: 65536 MB node 2 free: 44304 MB node 3 cpus: 3 7 11 15 19 23 27 31 35 39 node 3 size: 65536 MB node 3 free: 44329 MB node distances: node 0 1 2 3 0: 10 21 21 21 1: 21 10 21 21 2: 21 21 10 21 3: 21 21 21 10
lscpu コマンドは util-linux パッケージで提供されます。CPU 数、スレッド数、コア数、ソケット数、NUMA ノード数など CPU のアーキテクチャーに関する情報を収集して表示します。
$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 40 On-line CPU(s) list: 0-39 Thread(s) per core: 1 Core(s) per socket: 10 Socket(s): 4 NUMA node(s): 4 Vendor ID: GenuineIntel CPU family: 6 Model: 47 Model name: Intel(R) Xeon(R) CPU E7- 4870 @ 2.40GHz Stepping: 2 CPU MHz: 2394.204 BogoMIPS: 4787.85 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 30720K NUMA node0 CPU(s): 0,4,8,12,16,20,24,28,32,36 NUMA node1 CPU(s): 2,6,10,14,18,22,26,30,34,38 NUMA node2 CPU(s): 1,5,9,13,17,21,25,29,33,37 NUMA node3 CPU(s): 3,7,11,15,19,23,27,31,35,39
lstopo コマンドは hwloc パッケージで提供されます。システムをグラフィカルなイメージで表示します。lstopo-no-graphics コマンドを使用するとテキスト形式の出力になります。

4.1.2. スケジューリング
4.1.2.1. カーネルティック
nohz_full) が用意されユーザー領域タスクによるカーネルの干渉を低減することで決定論がさらに向上されています。オプションは nohz_full カーネルパラメーターを使用すると指定したコアで有効にすることができます。コアでオプションを有効にすると時間管理に関するアクティビティーはすべて待ち時間に制約のないコアに移動されます。ユーザー領域のタスクがカーネルタイマーティック関連の待ち時間にマイクロ秒単位で制約がある高性能な計算やリアルタイムの計算を必要とする作業に便利です。
4.1.3. IRQ (Interrupt Request ー 割り込み要求) の処理
4.2. パフォーマンス関連の問題の監視と診断
4.2.1. turbostat
$ man turbostat
4.2.2. numastat
重要
$ man numastat
4.2.3. /proc/interrupts
/proc/interrupts ファイルには特定の I/O デバイスから各プロセッサーに送信された割り込み数が記載されています。内容は割り込み要求 (IRQ) 数、各プロセッサーで処理されたタイプ別割り込み要求数、送信された割り込みタイプ、記載割り込み要求に応答したデバイスをコンマで区切った一覧などになります。
4.3. 推奨設定
4.3.1. カーネルティックタイムの設定
nohz_full パラメーターを使ってそのコアを指定します。16 コアシステムなら nohz_full=1-15 と指定すると動的ティックレス動作が 1 から 15 までのコアで有効になり時間管理はすべて未指定のコアに移動されます (コア 0)。この動作は起動時に一時的に有効にすることも /etc/default/grub ファイルで永続的に有効にすることもできます。永続的に有効にする場合は grub2-mkconfig -o /boot/grub2/grub.cfg コマンドを実行して設定を保存します。
- システムが起動したら手作業で rcu スレッドを待ち時間に制約のないコアに移動します。この場合コア 0 に移動しています。
# for i in `pgrep rcu[^c]` ; do taskset -pc 0 $i ; done
- カーネルコマンドラインで
isolcpusパラメーターを使って特定のコアをユーザー領域タスクから隔離します。 - オプションでカーネルの write-back bdi-flush スレッドの CPU 親和性を housekeeping コアに設定することができます。
echo 1 > /sys/bus/workqueue/devices/writeback/cpumask
# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1
while :; do d=1; done 等を実行するスクリプトが考えられます。
# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1 1000 irq_vectors:local_timer_entry
# perf stat -C 1 -e irq_vectors:local_timer_entry taskset -c 1 stress -t 1 -c 1 1 irq_vectors:local_timer_entry
4.3.2. ハードウェアパフォーマンスポリシーの設定 (x86_energy_perf_policy)
performance モードで動作します。プロセッサーのサポートを必要とします。CPUID.06H.ECX.bit3 の表示があればサポートされています。実行する場合は root 権限で行ってください。
$ man x86_energy_perf_policy
4.3.3. taskset でプロセスの親和性を設定する
重要
$ man taskset
4.3.4. numactl で NUMA 親和性を管理する
$ man numactl
注記
libnuma ライブラリーが収納され、カーネル対応の NUMA ポリシーに対するシンプルなプログラミングインターフェースを提供しています。numactl アプリケーションに比べより高度な調整を行うことができます。詳細については man ページをご覧ください。
$ man numa
4.3.5. numad を使用した NUMA 親和性の自動管理
numad は自動で NUMA の親和性を管理するデーモンです。NUMA トポロジーとシステム内のリソース使用を監視して NUMA によるリソース管理と管理を動的に改善します。
$ man numad
4.3.6. スケジューリングポリシーの調整
4.3.6.1. スケジューリングポリシー
4.3.6.1.1. SCHED_FIFO を使った静的優先度のスケジューリング
SCHED_FIFO (静的優先度スケジューリングとも呼ばれる) はリアルタイムポリシーで各スレッドに固定の優先度を指定します。このポリシーを使用するとイベントの応答時間を改善し待ち時間を低減させることができるため、長期間は実行しない時間的制約のあるタスク対しての使用が推奨されます。
SCHED_FIFO を使用すると、スケジューラーは SCHED_FIFO 全スレッドの一覧を優先度順にスキャンし実行準備ができているスレッドで最も順位が高いスレッドをスケジュールに入れます。SCHED_FIFO スレッドの優先レベルは 1 から 99 で指定することができ、99 が最も高い優先度になります。Red Hat では最初は低い順位で使用を開始し、待ち時間に関する問題が見つかった場合にのみ徐々に優先度を上げていく方法を推奨しています。
警告
SCHED_FIFO の帯域幅を制限してリアルタイムのアプリケーションプログラマーがプロセッサーを独占するリアルタイムのタスクを開始しないよう阻止することができます。
- /proc/sys/kernel/sched_rt_period_us
- 上記のパラメーターはプロセッサー帯域幅の 100% とみなされるべき時間をマイクロ秒で定義します。デフォルト値は
1000000μs もしくは 1 秒です。 - /proc/sys/kernel/sched_rt_runtime_us
- 上記のパラメーターはリアルタイムスレッドの実行に当てられる時間をマイクロ秒で定義します。デフォルト値は
950000μs もしくは 0.95 秒です。
4.3.6.1.2. SCHED_RR を使ったラウンドロビン方式の優先度スケジューリング
SCHED_RR は SCHED_FIFO のラウンドロビン版になります。複数のスレッドを同じ優先レベルで実行しなければならない場合に便利です。
SCHED_FIFO と同様、SCHED_RR は各スレッドに固定の優先度を指定するリアルタイムポリシーになります。スケジューラーは SCHED_RR 全スレッドの一覧を優先度順にスキャンし実行準備ができているスレッドで最も優先順位が高いスレッドをスケジュールに入れます。ただし、SCHED_FIFO とは異なり複数のスレッドが同じ優先度を持つ場合は特定の時間内でラウンドロビン方式にスケジュールが行われます。
sched_rr_timeslice_ms カーネルパラメーターを使って秒単位で設定することができます (/proc/sys/kernel/sched_rr_timeslice_ms)。最も小さい値は 1 ミリ秒になります。
4.3.6.1.3. SCHED_OTHER を使った通常のスケジュール
SCHED_OTHER がデフォルトのスケジューリングポリシーになります。CFS (Completely Fair Scheduler) を使ってこのポリシーでスケジュールされているスレッドすべてに対してプロセッサーへの公平なアクセスを提供します。多量のスレッドやデータの処理が重要な場合にはこのポリシーの方が長い期間で見ると効率的なスケジュールになります。
4.3.6.2. CPU の分離
isolcpus 起動パラメーターを使用するとスケジューラーから CPU を切り離すことができます。これによりスケジューラーがその CPU 上にあるユーザー領域のスレッドをスケジュールしないよう保護します。
isolcpus=2,5-7
isolcpus パラメーターを使用する場合とは若干異なり、isolcpus で得られるようなパフォーマンスの改善は現時点では期待できません。ツールの詳細については「Tuna を使った CPU、スレッド、割り込みの親和性などの設定」を参照してください。
4.3.7. 割り込みの親和性の設定
smp_affinity があり、割り込み要求を処理するプロセッサーはこのプロパティーによって指定されます。アプリケーションのパフォーマンスを改善するには割り込みの親和性とプロセスの親和性を同じプロセッサーまたは同じコアにある複数のプロセッサーに割り当てます。これにより指定した割り込みとアプリケーションスレッドがキャッシュラインを共有できるようになります。
/proc/irq/irq_number/smp_affinity ファイルに格納されます。smp_affinity はシステム内の全プロセッサーを表す 16 進数のビットマスクで保存されます。デフォルト値は f でシステム内のどのプロセッサーでも割り込み要求を処理できるという意味になります。この値を 1 に設定すると割り込み要求を処理できるのはプロセッサー 0 のみになります。
smp_affinity 値を区切って設定する必要があります。例えば、64 プロセッサーシステムの最初の 32 プロセッサーにのみ割り込み要求の処理を行わせたい場合は以下を実行します。
# echo 0xffffffff,00000000 > /proc/irq/IRQ_NUMBER/smp_affinity
注記
smp_affinity を修正するとハードウェアが設定され、カーネルを介入させることなくハードウェアレベルで特定プロセッサーに割り込みを処理させる決定が行われるようになります。割り込みステアリングについては「7章ネットワーク」を参照してください。
4.3.8. Tuna を使った CPU、スレッド、割り込みの親和性などの設定
# tuna --cpus CPUs --isolate
# tuna --cpus CPUs --include
# tuna --irqs IRQs --cpus CPU --move
sfc1* の全割り込み要求を検索することもできます。
# tuna -q sfc1* -c7 -m -x
# tuna --threads thread --priority policy:level
第5章 メモリー
5.1. 留意事項
5.1.1. 大きなページサイズ
HugeTLB 機能 (本書では static huge pages とも呼ばれます) と Transparent Huge Page 機能の 2 つの異なる大規模ページ機能を使用できます。
5.1.2. TLB (Translation Lookaside Buffer) サイズ
5.2. パフォーマンスに関する問題の監視と診断
5.2.1. vmstat を使ったメモリー使用量の監視
$ vmstat -s
$ man vmstat
5.2.2. Valgrind を使ったアプリケーションのメモリー使用量のプロファイリング
# yum install valgrind
5.2.2.1. Memcheck を使ったメモリー使用量のプロファイリング
- 発生してはいけないメモリーアクセス
- 未定義または未初期化の値の使用
- ヒープメモリーの不正な解放
- ポインターの重複
- メモリーリーク
注記
# valgrind --tool=memcheck application
- --leak-check
- アプリケーションの実行が完了すると memcheck によりメモリーリークの検索が行われます。デフォルト値は検出したメモリーリーク数を出力する
--leak-check=summaryになります。--leak-check=yesや--leak-check=fullを指定するとリークそれぞれの詳細を出力させることができます。無効にする場合は--leak-check=noを指定します。 - --undef-value-errors
- デフォルト値は未定義の値が使用された場合にエラーを報告する
--undef-value-errors=yesです。--undef-value-errors=noを指定するとこの報告を無効にしてメモリーチェックの速度を若干早めることができます。 - --ignore-ranges
--ignore-ranges=0xPP-0xQQ,0xRR-0xSSなどのようにメモリーアクセスを確認する際 memcheck に無視させる範囲を指定します。
/usr/share/doc/valgrind-version/valgrind_manual.pdf に収納されているドキュメントをご覧ください。
5.2.2.2. Cachegrind を使ったキャッシュ使用量のプロファイリング
# valgrind --tool=cachegrind application
- --I1
--I1=size,associativity,line_sizeなどのように第 1 レベルの命令キャッシュのサイズ、結合性、行サイズを指定します。- --D1
--D1=size,associativity,line_sizeなどのように第 1 レベルのデータキャッシュのサイズ、結合性、行サイズを指定します。- --LL
--LL=size,associativity,line_sizeなどのように最後のレベルのキャッシュのサイズ、結合性、行サイズを指定します。- --cache-sim
- キャッシュアクセスおよびミスの数の収集を有効化または無効化します。デフォルトでは有効になっています (
--cache-sim=yes)。このオプションと--branch-simの両方を無効にすると cachegrind には収集する情報がなくなります。 - --branch-sim
- ブランチ命令と誤った予測数の収集を有効化または無効化します。デフォルトでは有効になっています (
--branch-sim=yes)。このオプションと--cache-simの両方を無効にすると cachegrind には収集する情報がなくなります。Cachegrind はプロファイリングの詳細情報をプロセスごとのcachegrind.out.pidファイルに書き込みます。pid はプロセスの識別子になります。この詳細情報は付随する cg_annotateツールでさらに以下のように処理することができます。# cg_annotate cachegrind.out.pid
# cg_diff first second
/usr/share/doc/valgrind-version/valgrind_manual.pdf に収納されているドキュメントを参照してください。
5.2.2.3. Massif を使ったヒープとスタックの領域プロファイリング
# valgrind --tool=massif application
- --heap
- massif にヒープのプロファイリングを行わせるかどうかを指定します。デフォルト値は
--heap=yesです。--heap=noに設定するとヒープのプロファイリングが無効になります。 - --heap-admin
- ヒープのプロファイリングを有効にした場合の管理に使用するブロックごとのバイト数を指定します。デフォルト値は
8バイトです。 - --stacks
- massif にスタックのプロファイリングを行わせるかどうかを指定します。スタックのプロファイリングにより massif の動作がかなり遅くなる可能性があるため、デフォルト値は
--stack=noです。スタックのプロファイリングを有効にする場合は--stack=yesに設定します。プロファイリングするアプリケーションに関連するスタックサイズの変更をよりわかりやすく示すため massif はメインスタックの開始時のサイズはゼロであると仮定している点に注意してください。 - --time-unit
- massif でプロファイリングデータを収集する間隔を指定します。デフォルト値は
i(命令を実行) です。ms(ミリ秒数またはリアルタイム) やB(ヒープおよびスタックで割り当てられたバイト数または割り当て解除されたバイト数) を指定することもできます。ハードウェアが異なる場合でもほぼ再現が可能なため短時間実行のアプリケーションやテスト目的の場合には割り当てられたバイト数を確認すると役に立ちます。
massif.out.pid ファイルに出力します。pid は指定アプリケーションのプロセス識別子になります。ms_print ツールはこのプロファイリングデータを図式化しアプリケーション実行中のメモリー消費量を表示すると共にメモリー割り当てのピーク時に割り当てを行うサイトに関する詳細情報を表示します。massif.out.pid ファイルのデータを図式化するには次のコマンドを実行します。
# ms_print massif.out.pid
/usr/share/doc/valgrind-version/valgrind_manual.pdf に収納されているドキュメントを参照してください。
5.3. HugeTLB 大規模ページの設定
と実行時の 2 つの方法があります。起動時に予約すると、メモリーの断片化がそれほど行われていないため、成功の可能性が高くなります。ただし、NUMA マシンでは、複数のページが NUMA ノード間で自動的に分割されます。実行時の方法では、NUMA ノードごとに大規模ページを予約できます。実行時の予約が起動プロセスでできるだけ早いタイミングで行われる場合は、メモリーの断片化の可能性が低くなります。
5.3.1. 起動時の大規模ページの設定
- hugepages
- 起動時にカーネルで設定する永続大規模ページ数を定義します。デフォルト値は 0 です。物理的に近接な空きページが十分にある場合にしか大規模ページを割り当てることはできません。このパラメーターで予約されるページは他の目的には使用できません。この値は起動後、
/proc/sys/vm/nr_hugepagesファイルの値を変更することで調整可能です。NUMA システムの場合、このパラメーターで割り当てた大規模ページはノード間で平等に分割されます。実行中、大規模ページを特定ノードに割り当てる場合はそのノードの/sys/devices/system/node/node_id/hugepages/hugepages-1048576kB/nr_hugepagesファイルの値を変更します。詳細についてはデフォルトで/usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txtにインストールされるカーネル関連ドキュメントをお読みください。 - hugepagesz
- 起動時にカーネルで設定する永続大規模ページのサイズを定義します。使用できる値は 2 MB と 1 GB です。デフォルト値は 2 MB です。
- default_hugepagesz
- 起動時にカーネルで設定する永続大規模ページのデフォルトサイズを定義します。使用できる値は 2 MB と 1 GB です。デフォルト値は 2 MB です。
手順5.1 起動初期時に 1 GB ページを予約
- 次の行をカーネルコマンドラインオプションに追加して、1 GB ページ向けの HugeTLB プールを作成します。
default_hugepagesz=1G hugepagesz=1G
/usr/lib/systemd/system/hugetlb-gigantic-pages.serviceという名前のファイルを次の内容で作成します。[Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/systemd/hugetlb-reserve-pages [Install] WantedBy=sysinit.target
/usr/lib/systemd/hugetlb-reserve-pagesという名前のファイルを次の内容で作成します。nodes_path=/sys/devices/system/node/ if [ ! -d $nodes_path ]; then echo "ERROR: $nodes_path does not exist" exit 1 fi reserve_pages() { echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages } # This example reserves 2 1G pages on node0 and 1 1G page on node1. You # can modify it to your needs or add more lines to reserve memory in # other nodes. Don't forget to uncomment the lines, otherwise then won't # be executed. # reserve_pages 2 node0 # reserve_pages 1 node1- ファイルのコメントに従って
/usr/lib/systemd/hugetlb-reserve-pagesを変更します。 - 次のコマンドを実行して起動初期の予約を有効にします。
# chmod +x /usr/lib/systemd/hugetlb-reserve-pages # systemctl enable hugetlb-gigantic-pages
注記
任意のタイミングでnr_hugepagesに書き込みを行うことにより、1G を超えるページを実行時に予約できます。ただし、このような予約はメモリーの断片化により失敗することがあります。1G ページを予約するには、手順 4 で説明された起動初期時に予約する方法が最も安定的です。
5.3.2. 実行時の大規模ページの設定
- /sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages
- 指定 NUMA ノードに割り当てる指定サイズの大規模ページ数を定義します。これは Red Hat Enterprise Linux 7.1 からの対応になります。次の例では 2048 kB の大規模ページを 20 ページ
node2に割り当てています。# numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total add AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 0 0 0 HugePages_Free 0 0 0 0 0 HugePages_Surp 0 0 0 0 0 # echo 20 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages # numastat -cm | egrep 'Node|Huge' Node 0 Node 1 Node 2 Node 3 Total AnonHugePages 0 2 0 8 10 HugePages_Total 0 0 40 0 40 HugePages_Free 0 0 40 0 40 HugePages_Surp 0 0 0 0 0 - /proc/sys/vm/nr_overcommit_hugepages
- メモリーのオーバーコミット中、システムで作成、使用が可能な追加の大規模ページの最大数を定義します。このファイルにゼロ以外の値を書き込むと、永続大規模ページのプールを使い切ってしまった場合にカーネルの通常ページのプールから指定した大規模ページ数が取得されます。この余剰大規模ページについては未使用になると解放されカーネルの通常プールに戻されます。
5.4. Transparent Huge Page の設定
madvise() システムコールで指定された個別プロセスのメモリー領域のみに大規模ページを割り当てます。
# cat /sys/kernel/mm/transparent_hugepage/enabled
# echo always > /sys/kernel/mm/transparent_hugepage/enabled
# echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
direct compaction を disabled にします。
# echo madvise > /sys/kernel/mm/transparent_hugepage/defrag
/usr/share/doc/kernel-doc-kernel_version/Documentation/vm/transhuge.txt ファイルを参照してください。
5.5. システムメモリー容量の設定
/proc ファイルシステム内の該当ファイルの値を変更し、テストとして一時的に設定することができます。そのパラメーターで使用環境に適したパフォーマンスが得られることを確認したら sysctl コマンドを使って今度は永続的にパラメーターを設定します。
# echo 1 > /proc/sys/vm/overcommit_memory
/etc/sysctl.conf で sysctl vm.overcommit_memory=1 を追加し、次のコマンドを実行します。
# sysctl -p
注記
5.5.1. 仮想マシンのパラメーター
/proc/sys/vm にあります。
- dirty_ratio
- パーセント値です。指定したパーセント値の合計メモリーが変更されるとシステムはその変更を
pdflush演算でディスクに記述し始めます。デフォルト値は20% です。 - dirty_background_ratio
- パーセント値です。指定したパーセント値の合計メモリーが変更されるとシステムはその変更をバックグラウンドでディスクに記述し始めます。デフォルト値は
10% です。 - overcommit_memory
- 大量メモリーの要求を許可するか拒否するか決定する条件を定義します。デフォルト値は
0です。デフォルトではカーネルは利用可能なメモリー量と要求されるメモリー量が大き過ぎるため失敗する要求数を推測し経験則的なメモリーオーバーコミット処理を行います。ただし、正確なアルゴリズムではなく経験則を使ってメモリーの割り当てを行うため、この設定の場合はメモリーがオーバーロードする可能性があります。このパラメーターを1に設定するとカーネルはメモリーのオーバーコミット処理を行いません。このためメモリーのオーバーロードの可能性が高くなりますが、メモリー集約型のタスクパフォーマンスは向上します。2に設定するとカーネルは利用可能な swap 領域とovercommit_ratioで指定されている物理 RAM の割合との合計と同等もしくはそれ以上のメモリー要求は拒否します。メモリーのオーバーコミットに対するリスクは低減しますが swap 領域が物理メモリーより大きいシステムにしか推奨していません。 - overcommit_ratio
overcommit_memoryが2に設定されている場合に考慮される物理 RAM の割合を指定します。デフォルト値は50です。- max_map_count
- プロセスで使用可能なメモリーマップ領域の最大数を定義します。ほとんどの場合デフォルト値の
65530が適した値になります。アプリケーション側でこのファイル数以上の数をマッピングする必要がある場合はこの値を増やします。 - min_free_kbytes
- システム全体で維持する空領域の最小値をキロバイト単位で指定します。これを使って各低メモリゾーンに適切な値が確定され、そのサイズに比例した空き予約ページ数が割り当てられます。
警告
設定値が低すぎるとシステムを破損する恐れがあります。min_free_kbytesの設定が低すぎると、システムによるメモリの回収が妨げられます。これによりシステムがハングし、メモリ不足によってプロセスが強制終了される可能性があります。ただし、min_free_kbytesの設定が高すぎると (システムメモリー合計の 5–10% など) システムがすぐにメモリー不足に陥ってしまうためメモリーの回収に非常に時間がかかることになります。 - oom_adj
panic_on_oomパラメーターが0に設定されている状態でメモリーを使い切ってしまうと、oom_killer関数はシステムが復元できるようになるまでプロセスを強制終了し、プロセスを最も高いoom_scoreで起動します。oom_adjパラメーターはプロセスのoom_scoreを確定する際に役立ちます。このパラメーターはプロセスの識別子ごとに設定されています。-17の値を設定するとそのプロセスのoom_killerは無効になります。これ以外にも-16から15までの値を使用することができます。注記
調整されたプロセスによって生成されたプロセスは、プロセスのoom_scoreを継承します。- スワップ
- swappiness 値 (
0〜100) は、システムが匿名メモリーやページキャッシュを優先する度合いを制御します。値が大きい場合は、ファイルシステムのパフォーマンスが改善され、あまり活発ではないプロセスが RAM から積極的にスワップされます。値が小さい場合は、メモリーからのプロセスのスワップが回避されます。通常この場合は、レイテンシーが低下しますが I/O パフォーマンスが犠牲になります。デフォルト値は60です。警告
swappiness==0に設定すると非常に強力にスワップを避けるため、メモリーおよび I/O に圧力がかかりメモリー不足によるプロセスの強制終了のリスクが高まります。
5.5.2. ファイルシステムのパラメーター
/proc/sys/fs にあります。
- aio-max-nr
- アクティブな非同期の全入出力コンテキスト内で許可されるイベントの最大数を定義します。デフォルト値は
65536です。この値を変更しても、カーネルデータ構造を事前に割り当てたり、サイズの変更がされないことに留意してください。 - file-max
- システム全体のファイルハンドルの最大数を決定します。Red Hat Enterprise Linux 7 のデフォルト値は最大値である
8192、またはカーネルの起動時に利用可能な空きメモリーページの 1/10 です。この値を上げるとファイル処理数の不足が原因のエラーを解決できるようになります。
5.5.3. カーネルパラメーター
/proc/sys/kernel/ ディレクトリーにある以下のパラメーターのデフォルト値は、利用可能なシステムリソースに応じて起動時にカーネルによって計算されます。
- msgmax
- メッセージキュー内の 1 メッセージの最大許容サイズをバイト単位で定義します。この値はキューのサイズ (
msgmnb) を超えることはできません。システムの現在のmsgmax値を確認するには、以下のコマンドを使用します。# sysctl kernel.msgmax
- msgmnb
- 1 メッセージキューの最大サイズをバイト単位で定義します。システムの現在の
msgmnb値を確認するには、以下のコマンドを使用します。# sysctl kernel.msgmnb
- msgmni
- メッセージキュー識別子の最大数 (つまりキューの最大数) を定義します。システムの現在の
msgmni値を確認するには、以下のコマンドを使用します。# sysctl kernel.msgmni
- shmall
- システム上で一度に使用可能な共有メモリーの総ページ数を定義します。ちなみに、AMD64 および Intel 64 アーキテクチャーでは 1 ページは 4096 バイトに相当します。システムの現在の
shmall値を確認するには、以下のコマンドを使用します。# sysctl kernel.shmall
- shmmax
- カーネルで許容される 1 共有メモリーセグメントの最大サイズをバイト単位で定義します。システムの現在の
shmmax値を確認するには、以下のコマンドを使用します。# sysctl kernel.shmmax
- shmmni
- システム全体の共有メモリーセグメントの最大数を定義します。いずれのシステムでもデフォルト値は
4096です。 - threads-max
- システム全体でカーネルが一度に使用できるスレッドの最大数を定義します。システムの現在の
threads-max値を確認するには、以下のコマンドを使用します。# sysctl kernel.threads-max
デフォルト値は、以下の式で算出されます。mempages / (8 * THREAD_SIZE / PAGE SIZE )
最小値は20です。
第6章 ストレージとファイルシステム
6.1. 留意事項
- データの書き込みと読み取りのパターン
- ベースとなる配列でデータを整列
- ブロックサイズ
- ファイルシステムのサイズ
- ジャーナルサイズと場所
- レコーディングのアクセスタイム
- データ信頼性の確保
- 事前読み出しのデータ
- 事前割り当てのディスク領域
- ファイル断片化
- リソース競合
6.1.1. I/O スケジューラー
- deadline
- SATA ディスク以外のすべてのブロックデバイス向けのデフォルト I/O スケジューラーです。
Deadlineにより、要求が I/O スケジューラーに到達した時点からの要求のレイテンシーが保証されます。このスケジューラーはほとんどのユースケースに適していますが、特に書き込み動作より読み取り動作の方が頻繁に起こるユースケースに適しています。キュー待ち I/O 要求は、読み取りまたは書き込みのバッチに分けられてから、増大している論理ブロックアドレス順に実行スケジュールに入れられます。アプリケーションは読み取り I/O でブロックする可能性の方が高いため、デフォルトでは読み取りバッチの方が書き込みバッチより優先されます。1 バッチが処理されるとdeadlineは書き込み動作が待機している長さを確認して次の読み取りバッチまたは書き込みバッチを適宜スケジュールします。1 バッチで処理する要求数、書き込みのバッチ 1 つに対して発行する読み取りのバッチ数、要求が期限切れになるまでの時間などはすべて設定、変更が可能です。詳細は「deadline スケジューラーのチューニング」をご覧ください。 - cfq
- SATA ディスクとして識別されるデバイスに限りデフォルトとなるスケジューラーです。
cfq(Completely Fair Queueing) スケジューラーはプロセスをリアルタイム、ベストエフォート、アイドルの 3 種類のクラスに分割します。リアルタイムクラスのプロセスは常にベストエフォートのプロセスより先に処理され、ベストエフォートのプロセスはアイドルクラスのプロセスより先に処理されます。つまり、リアルタイムクラスのプロセスは、ベストエフォートおよびアイドルのクラスプロセス時間を奪うことになります。デフォルトでは、プロセスはベストエフォートクラスに割り当てられます。Cfqは過去データを使ってアプリケーションで発行される今後の I/O 要求数の増減を予測します。I/O の増加を予測した場合は他のプロセスの I/O が処理を待機している場合であってもアイドリングを行い新しい I/O を待ちます。cfq スケジューラーはアイドリング状態になりやすいため、意図的な調整を行わない限り、シーク時間を多く要さないハードウェアとは併用しないようにしてください。また、ホストベースのハードウェア RAID コントローラーなど、負荷節約型ではない他のスケジューラーとの併用も避けてください。こうしたスケジューラーを重ねると待ち時間が長くなる傾向があります。Cfqの動作は高度な設定が可能です。詳細は「cfq スケジューラーのチューニング」を参照してください。 - noop
noopI/O スケジューラーはシンプルな FIFO (first-in first-out) のスケジューリングアルゴリズムを実装しています。要求は 単純な last-hit キャッシュを介して汎用のブロック層でマージされます。これは、高速なストレージを使用した CPU バインドシステムに最適な I/O スケジューラーとなります。
6.1.2. ファイルシステム
6.1.2.1. XFS
6.1.2.2. Ext4
6.1.2.3. Btrfs (テクノロジープレビュー)
- ファイルシステム全体ではなく特定のファイル、ボリューム、またはサブボリュームのスナップショットを取得する機能。
- Redundant Array of Inexpensive Disks (RAID) の複数のバージョンのサポート。
- I/O エラーとファイルシステムオブジェクトのマップの逆参照。
- 透過的な圧縮 (パーティション上のすべてのファイルは自動的に圧縮されます)。
- データおよびメタデータのチェックサム。
6.1.2.4. GFS2
6.1.3. ファイルシステムの一般的なチューニングで考慮すべき点
6.1.3.1. 時刻のフォーマットに関する注意点
- サイズ
- 負荷に適したサイズのファイルシステムを作成します。ファイルシステムのサイズが小さければ比例してバックアップに要する時間も短くなり、ファイルシステムのチェックにかかる時間やメモリーも少なくてすみます。ただし、ファイルシステムが小さ過ぎると深刻な断片化によるパフォーマンスの低下が発生します。
- ブロックサイズ
- ブロックとはファイルシステムの作業単位であり、ブロックサイズとは 1 ブロック内に格納できるデータ量です。つまり 1 度に書き込まれる、または読み取られる最小限のデータ量になります。一般的な使用例のほとんどでデフォルトのブロックサイズが適したサイズになります。ただし、ブロックサイズ (または複数ブロックのサイズ) は一度に読み取られるまたは書き込まれる一般的なデータ量と同じか若干大きい方がファイルシステムのパフォーマンスが向上しデータをより効率的に格納するようになります。ファイルサイズは小さくても 1 ブロック全体が使用されます。複数ファイルが複数ブロックをまたいで使用することがありますが、実行時に余分なオーバーヘッドが生まれる可能性があります。また、ブロック数に制限のあるファイルシステムがあるため、この場合はファイルシステムの最大サイズも制限されることになります。デバイスを
mkfsコマンドでフォーマット化する際にファイルシステムのオプションとしてブロックサイズを指定します。ブロックサイズを指定するパラメーターはファイルシステムにより異なります。詳細はmkfsの man ページをご覧ください。たとえば、XFS ファイルシステムをフォーマット化する場合に利用できるオプションを表示させるには次のコマンドを実行します。$ man mkfs.xfs
- 配置
- ファイルシステムの配列はファイルシステム全体にデータを配分することに関係しています。RAID などのストライプ型ストレージを使用する場合はデバイスのフォーマット時にベースとなるストレージの配列でデータやメタデータを揃えることでパフォーマンスを改善できます。多くのデバイスは特定のファイルシステムでフォーマットを行う際に自動的に設定される推奨配列をエクスポートします。使用するデバイスが推奨配列をエクスポートしない、または推奨されている設定を変更したい場合などは mkfs でデバイスのフォーマットを行う際に手作業で配列を指定する必要があります。ファイルシステムの配列を指定するパラメーターはファイルシステムによって異なります。詳細は使用するファイルシステムの
mkfsman ページをご覧ください。たとえば、ext4 ファイルシステムのフォーマット時に使用できるオプションを表示させる場合は次のコマンドを実行します。$ man mkfs.ext4
- 外部ジャーナル
- ファイルシステムのジャーナル機能は書き込み動作が実行される前にその書き込み動作で加えられる予定の変更をジャーナルファイルに記録します。これによりシステムクラッシュや停電などが発生した場合のデバイスの破損の可能性を低減し、復元プロセスをスピード化します。メタデータの処理率が高い負荷の場合はジャーナルへの更新がかなり頻繁に必要になります。ジャーナルが大きいほどメモリー使用量も高くなりますが書き込み動作の頻度は減ります。また、メタデータの処理率が高い負荷を処理するデバイスのシーク時間を改善するには、そのジャーナルをより高速な処理が行えるプライマリーストレージとは別の専用ストレージに配置します。
警告
外部ジャーナルが信頼できるものであることを確認してください。外部のジャーナルデバイスが失われるとファイルシステムが破損します。外部ジャーナルはフォーマット時に作成してください。ジャーナルデバイスはマウント時に指定されたものを使用します。詳細についてはmkfsの man ページおよびmountの man ページを参照してください。$ man mkfs
$ man mount
6.1.3.2. マウント時の注意点
- バリア
- ファイルシステムバリアによりメタデータが正しく順番通りに永続ストレージに書き込まれ、停電時には
fsyncで送信したデータが必ず維持されるようになります。Red Hat Enterprise Linux の旧バージョンではファイルシステムバリアを有効にするとfsyncに大きく依存するアプリケーションや小さなファイルを多数作成したり削除したりするアプリケーションなどの速度が著しく低下することがありました。Red Hat Enterprise Linux 7 ではファイルシステムバリアのパフォーマンスが改善され、ファイルシステムバリアを無効にしても、パフォーマンスに対する影響はごくわずかになります (3 % 未満)。詳細については https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/ の『Red Hat Enterprise Linux 7 ストレージ管理ガイド』を参照してください。 - アクセス時間
- ファイルが読み込まれる度、アクセスが起きた時間 (
atime) でそのメタデータが更新されます。これによりさらに書き込み I/O が発生します。デフォルトでは Red Hat Enterprise Linux 7 は前回のアクセス時間が最後の変更 (mtime) または状態変更 (ctime) の時間より古い場合にのみatimeフィールドを更新するため、ほとんどの場合、このオーバーヘッドが最小になります。ただし、このメタデータの更新に時間がかかり、また正確なアクセス時間のデータは必要としない場合、noatimeマウントオプションを付けてファイルシステムをマウントすることができます。このオプションを付けるとファイルの読み取り時のメタデータへの更新が無効になります。また、nodiratime動作が有効になるためディレクトリーの読み取り時のメタデータへの更新も無効になります。 - 先読み (read-ahead)
- 先読みは、すぐに必要になる可能性が高いデータを先に取得してページキャッシュにロードすることでディスクからより早くデータを読み出すことが可能になるため、ファイルアクセスの速度が速くなります。先読みの値が高いほどより多くのデータを先に取得します。Red Hat Enterprise Linux は検出対象に応じて適切な先読み値の設定を試行します。ただし、正確な検出が常に可能なわけではありません。たとえば、ストレージアレイを単一の LUN としてシステムに提示すると、システム側はそれを単一の LUN として検出するためアレイに適切な先読み値を設定しません。連続 I/O による多量のストリーミングを必要とする作業負荷の場合は先読み値を高くすると役に立つことがよくあります。Red Hat Enterprise Linux 7 で用意されているストレージ関連の調整済みプロファイルでは LVM ストライプを使用するため先読み値が高く設定されています。しかし、この調整が必ずしもあらゆる作業負荷に十分なわけではありません。先読み動作を定義するパラメーターはファイルシステムにより異なります。詳細は mount の man ページをご覧ください。
$ man mount
6.1.3.3. メンテナンス
- バッチ破棄
- このタイプの破棄は fstrim コマンドの一部になります。指定した基準と一致するファイルシステム内の未使用ブロックをすべて破棄します。Red Hat Enterprise Linux 7 では、物理的な破棄動作に対応している XFS と ext4 フォーマットのデバイスでバッチ破棄がサポートされます (つまり、
/sys/block/devname/queue/discard_max_bytesの値がゼロ以外の HDD デバイスおよび/sys/block/devname/queue/discard_granularityの値が0以外の SSD デバイス)。 - オンライン破棄
- このタイプの破棄動作はマウント時に
discardオプションを使って設定します。ユーザーの介入を必要とせずリアルタイムで実行されます。ただし、オンライン破棄は使用中から空きの状態に移行しているブロックしか破棄しません。Red Hat Enterprise Linux 7 では XFS および ext4 フォーマットのデバイスでオンライン破棄をサポートしています。パフォーマンス維持にオンライン破棄が必要な状況やシステムの作業負荷上バッチ破棄が実行できないような状況を除き、バッチ破棄の使用を推奨しています。 - 事前割り当て
- 事前割り当てではディスク領域にデータを書き込むことなくその領域がファイルに割り当てられたという印を付けます。データの断片化および読み取り能力の低下などを制限する場合に便利です。Red Hat Enterprise Linux 7 では XFS、ext4、GFS2 のデバイスでのマウント時の領域事前割り当てに対応しています。ファイルシステムに適したパラメーターについては
mountman ページをご覧ください。fallocate(2)glibc呼び出しを使用するとアプリケーションに対しても領域の事前割り当てが有効に働きます。
6.2. パフォーマンス関連の問題の監視と診断
6.2.1. vmstat を使ったシステムパフォーマンスの監視
- si
- スワップイン、またはスワップ領域からの読み取り (KB 単位)
- so
- スワップアウト、またはスワップ領域への書き込み (KB 単位)
- bi
- ブロックイン、書き込み動作のブロック (KB 単位)
- bo
- ブロックアウト、読み取り動作のブロック (KB 単位)
- wa
- I/O 動作の完了を待機しているキューの部分
$ man vmstat
6.2.2. iostat を使った I/O パフォーマンスの監視
$ man iostat
6.2.2.1. blktrace を使った詳細な I/O 分析
$ man blktrace
$ man blkparse
6.2.2.2. btt を使った blktrace 出力の分析
Q2Q) がブロック層で要求が費やしている合計時間 (Q2C) より長い場合、I/O サブシステムはパフォーマンスの問題とは関係ないかもしれません。デバイスのサービス処理に費やす時間が長い場合 (D2C)、デバイスがオーバーロードしているか、デバイスに送られた作業負荷が最適でない可能性があります。ブロック I/O に要求が割り当てられるまでに長時間キュー待ちしている場合は(Q2G) 使用中のストレージで I/O の負荷を処理できないことを示している可能性があります。
$ man btt
6.2.2.3. seekwatcher を使った blktrace 出力の分析
$ man seekwatcher
6.2.3. SystemTap を使ったストレージの監視
/usr/share/doc/systemtap-client/examples/io ディレクトリーにインストールされます。
disktop.stp- ディスクの読み取りや書き込みの状態を 5 秒ごとにチェックして上位 10 位のエントリーを出力します。
iotime.stp- 読み取りおよび書き込みの動作に費やした時間、読み取りと書き込みのバイト数を出力します。
traceio.stp- 監視した累積 I/O トラフィックに応じた上位 10 位の実行可能ファイルを毎秒出力します。
traceio2.stp- 指定デバイスに対して読み取りおよび書き込みが発生するとその実行可能ファイル名とプロセス ID を出力します。
inodewatch.stp- 指定のメジャーまたはマイナーデバイス上の指定 inode に対して読み取りや書き込みが発生するたびにその実行可能ファイル名とプロセス ID を出力します。
inodewatch2.stp- 指定のメジャーまたはマイナーデバイス上の指定 inode で属性が変更されるたびにその実行可能ファイル名、プロセス ID、属性を出力します。
6.3. ソリッドステートディスク (SSD)
SSD のチューニング時に考慮すべき点
/usr/share/doc/kernel-version/Documentation/block/switching-sched.txt ファイルを参照してください。
vm_dirty_background_ratio および vm_dirty_ratio の設定を低くすることができるでしょう。ただし、総 I/O 処理が増加する 場合があるため、ワークロードに固有のテストを実施しない限りこのチューニングはお勧めできません。
6.4. 設定ツール
6.4.1. ストレージパフォーマンス向けチューニングプロファイルの設定
- latency-performance
- throughput-performance (デフォルト)
$ tuned-adm profile name
tuned-adm recommend コマンドはシステムに適したプロファイルを推奨します。また、インストール時にデフォルトのプロファイルを設定するため、デフォルトのプロファイルに戻る場合にも使用できます。
6.4.2. デフォルト I/O スケジューラーの設定
cfq スケジューラーが使用され、その他すべてのドライブでは deadline スケジューラーが使用されます。このセクションで説明する手順に従ってデフォルトのスケジューラーを指定した場合には、そのデフォルトスケジューラーがすべてのデバイスに適用されます。
/etc/grub/default ファイルを修正して設定することができます。
elevator パラメーターを設定するには、disk プラグインを有効にします。disk プラグインの詳細については、『Tuned』の章の「プラグイン」を参照してください。
elevator パラメーターを追加します。Tuned ツールを使用するか、手順6.1「GRUB 2 を使用したデフォルト I/O スケジューラーの設定」で説明するように手動で /etc/grub/default ファイルを修正することができます。
手順6.1 GRUB 2 を使用したデフォルト I/O スケジューラーの設定
/etc/grub/defaultファイルのGRUB_CMDLINE_LINUX行に、elevatorパラメーターを追加します。#cat /etc/default/grub... GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vg00/lvroot rd.lvm.lv=vg00/lvswap elevator=noop" ...Red Hat Enterprise Linux 7 で使用可能なスケジューラーは、deadline、noop、およびcfqです。詳細については、お使いのカーネルのドキュメントに含まれているcfq-iosched.txtおよびdeadline-iosched.txtファイルを参照してください。これらは kernel-doc パッケージのインストールにより利用することができます。- 追加した
elevatorパラメーターを含む新しい設定ファイルを作成します。BIOS ファームウェアを使用しているシステムと UEFI ファームウェアを使用しているシステムとでは、GRUB 2 設定ファイルの場所が異なります。以下のコマンドのいずれかを使用して、GRUB 2 設定ファイルを再作成します。- BIOS ファームウェアを使用しているシステムの場合は、以下のコマンドを使用します。
#grub2-mkconfig -o /boot/grub2/grub.cfg - UEFI ファームウェアを使用しているシステムの場合は、以下のコマンドを使用します。
#grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
- システムを再起動して、変更を有効にします。GNU GRand Unified Bootloader バージョン 2 (GRUB 2) の詳細な情報については、『Red Hat Enterprise Linux 7 システム管理者のガイド』の「GRUB 2 について」セクションを参照してください。
6.4.3. デバイスの I/O スケジューラーの設定
/sys/block/devname/queue/scheduler ファイルを編集します。ここで、devname は設定するデバイスの名前です。
# echo cfq > /sys/block/hda/queue/scheduler
6.4.4. deadline スケジューラーのチューニング
deadline を使用するとキュー待ちの I/O 要求は読み取りまたは書き込みのバッチに分けられてから増大している論理ブロックアドレス順に実行スケジュールに入れられます。アプリケーションは読み取り I/O でブロックする可能性の方が高いため、デフォルトでは読み取りバッチの方が書き込みバッチより優先されます。1 バッチが処理されると deadline は書き込み動作が待機している長さを確認して次の読み取りバッチまたは書き込みバッチを適宜スケジュールします。
deadline スケジューラーの動作に影響を与えるパラメーターです。
- fifo_batch
- ひとつのバッチで発行する読み取りまたは書き込みの動作数です。デフォルトは
16です。値を高くするほど処理能力も高まりますが待ち時間も増加します。 - front_merges
- 前方マージを一切生成しない作業負荷の場合、
0に設定することは可能です。ただし、このチェックのオーバーヘッドを測定していない限り Red Hat ではデフォルト値の1の使用を推奨しています。 - read_expire
- ミリ秒単位で指定します。この時間内に読み取り要求がスケジュールされます。デフォルト値は
500(0.5 秒) です。 - write_expire
- ミリ秒単位で指定します。この時間内に書き込み要求がスケジュールされます。デフォルト値は
5000(5 秒) です。 - writes_starved
- 読み取りバッチ数を指定します。指定バッチ数を先に処理してから書き込みバッチをひとつ処理します。高い値を設定するほど読み取りバッチの方が多く優先して処理されます。
6.4.5. cfq スケジューラーのチューニング
cfq を使用するとプロセスはリアルタイム、ベストエフォート、アイドルの 3 種類いずれかのクラスに配置されます。リアルタイムのプロセスはすべてベストエフォートのプロセスより先にスケジュールされます。ベストエフォートのプロセスはすべてアイドルのプロセスより先にスケジュールされます。デフォルトではプロセスはベストエフォートのクラスに配置されます。プロセスのクラスを手作業で調整する場合は ionice コマンドを使って行います。
cfq スケジューラーの動作をさらに調整することができます。パラメーターは /sys/block/devname/queue/iosched ディレクトリー配下にある指定ファイルでデバイスごとに設定を変更します。
- back_seek_max
cfqに後方シークを行わせる最長距離をキロバイトで指定します。デフォルト値は16KB です。後方シークは特にパフォーマンスを低下さるため、大きな値の使用は推奨していません。- back_seek_penalty
- ディスクヘッドで前方または後方への移動を決定する際に後方シークに対して適用する乗数を指定します。デフォルト値は
2です。ディスクヘッドの位置が 1024 KB でシステムに等距離の要求がある場合 (1008 KB と 1040 KB など)、back_seek_penaltyが後方シークの距離に対して適用されディスクは前方に移動します。 - fifo_expire_async
- ミリ秒単位の長さで指定します。非同期 (バッファされた書き込み) の要求を処理せず放置する長さです。この時間を過ぎると非同期の処理待ち要求が処理リストに移動されます。デフォルト値は
250ミリ秒です。 - fifo_expire_sync
- ミリ業単位の長さで指定します。同期 (読み取りまたは
O_DIRECT書き込み) の要求を処理せず放置する長さです。この時間を過ぎると非同期の処理待ち要求が処理リストに移動されます。デフォルト値は125ミリ秒です。 - group_idle
- このパラメーターはデフォルトでは
0(無効) に設定されます。1(有効) に設定するとcfqスケジューラーは制御グループ内で I/O を発行している最後のプロセスでアイドリングします。比例加重 I/O 制御グループを使用し、slice_idleを0に設定している (高速ストレージで) 場合に便利です。 - group_isolation
- このパラメーターはデフォルトでは
0(無効) に設定されます。1(有効) に設定するとグループ間をより強力に分離しますが、ランダムな作業負荷および連続した作業負荷の両方に対して公平性が適用されるため処理能力は低減されます。group_isolationを無効にすると (0の設定) 公平性は連続した作業負荷にのみ適用されます。詳細は/usr/share/doc/kernel-doc-version/Documentation/cgroups/blkio-controller.txtにインストールされているドキュメントをご覧ください。 - low_latency
- このパラメーターはデフォルトでは
1(有効) に設定されます。有効の場合、cfqはデバイスで I/O を発行している各プロセスごと最大300ミリ秒の待ち時間を与え処理能力より公平性を優先させます。0(無効) に設定するとターゲットの待ち時間は無視され、各プロセスは完全なタイムスライスを受け取ります。 - quantum
cfqがひとつのデバイスに一度に送信できる I/O 要求数を指定します。基本的にはキューの深さを制限します。デフォルト値は8です。使用するデバイス側はより深いキューに対応している可能性はありますが、quantum の値を上げると待ち時間も増えます。特に大量の連続する書き込み作業負荷がある場合は顕著です。- slice_async
- 非同期の I/O 要求を発行している各プロセスに割り当てるタイムスライスの長さを指定します (ミリ秒単位)。デフォルト値は
40ミリ秒です。 - slice_idle
- 次の要求を待つあいだ cfq にアイドリングを行わせる長さをミリ秒単位で指定します。デフォルト値は
0(キューまたはサービスツリーレベルではアイドリングを行わない) です。デフォルト値を使用すると外付け RAID ストレージでの処理能力が最適となりますが、シーク動作の総数が増加するため RAID ではない内蔵ストレージの場合には処理能力が低下します。 - slice_sync
- 同期 I/O 要求を発行している各プロセスに割り当てるタイムスライスの長さをしていします (ミリ秒単位)。デフォルト値は
100ミリ秒です。
6.4.5.1. 高速ストレージに cfq をチューニングする
cfq スケジューラーの使用は推奨しません。こうしたストレージで cfq を使用しなければならない場合は、次の設定ファイルを編集する必要があります。
/sys/block/devname/queue/ionice/slice_idleを0に設定します/sys/block/devname/queue/ionice/quantumを64に設定します/sys/block/devname/queue/ionice/group_idleを1に設定します
6.4.6. noop スケジューラーのチューニング
noop I/O スケジューラーは主に高速ストレージを使用し CPU 処理の占める割合が大きいシステムに便利です。要求はブロック層でマージされるため、noop の動作を修正する場合は /sys/block/sdX/queue/ ディレクトリー配下のファイルでブロック層のパラメーターを編集します。
- add_random
- いくつかの I/O イベントが
/dev/randomのエントロピープールに貢献しています。これらの貢献のオーバーヘッドが計測可能になる場合、このパラメーターを0に設定することができます。 - max_sectors_kb
- I/O 要求の最大サイズをキロバイト単位で指定します。デフォルト値は
512KB です。このパラメーターの最小値はストレージデバイスの論理ブロックサイズで確定されます。パラメーターの最大値はmax_hw_sectors_kbの値で確定されます。I/O 要求が内部消去ブロックサイズを超えるとパフォーマンスが低下する SSD があります。このような場合は、max_hw_sectors_kbを内部消去ブロックサイズまで減らすことを推奨しています。 - nomerges
- 要求のマージはほとんどの作業負荷に効果的ですが、デバッグが目的の場合はマージを無効にすると役に立つ場合があります。無効にする場合はこのパラメーターを
0に設定します。デフォルトでは有効になっています (1)。 - nr_requests
- 一度にキュー待ちさせることができる読み取りと書き込み要求の最大数を指定します。デフォルト値は
128です。つまり、読み取りまたは書き込みの要求に対する次の処理をスリープにさせるまでにそれぞれ 128 の読み取り要求と 128 の書き込み要求をキュー待ちさせることができます。待ち時間に影響を受けやすいアプリケーションの場合にはこのパラメーターの値を低くしてストレージのコマンドキューの深さを制限するとライトバック I/O が書き込み要求でデバイスのキューを満たさなくなります。デバイスのキューが満杯になると I/O 動作を実行しようとしている他のプロセスはキューが使用できるようになるまでスリープ状態になります。要求はラウンドロビン方式で割り当てられ、ひとつのプロセスが継続してキューを埋めてしまわないようにします。 - optimal_io_size
- このパラメーターを使用すると最適な I/O サイズを報告するストレージデバイスがあります。この値が報告される場合は、できるだけ報告された最適な I/O サイズに合わせその倍数の I/O をアプリケーションで発行させることを推奨しています。
- read_ahead_kb
- 連続的な読み取り動作を行っている際、ページキャッシュですぐに必要になる可能性が高い情報を格納するためオペレーティングシステムに先読みをさせる容量をキロバイト単位で指定します。
read_ahead_kbの値を高くすることでデバイスマッパーに効果を現すことがよくあります。各デバイスにマッピングする値として 128 KB から設定し始めると良いでしょう。 - rotational
- 一部の SSD はそのソリッドステート状態を正しく通知しないため、従来の回転ディスクとしてマウントされます。ご使用の SSD デバイスで、この値が自動的に
0に設定されない場合は、この値を手作業で設定し、スケジューラーで不要なシーク時間短縮ロジックを無効にします。 - rq_affinity
- デフォルトでは I/O 要求を発行したプロセッサーとは異なるプロセッサーで I/O の完了を処理することができます。
rq_affinityを1に設定するとこの機能を無効にして I/O の完了はその I/O 要求を発行したプロセッサーでしか行わないようにします。これによりプロセッサーのデータキャッシングの効率性が改善されます。
6.4.7. パフォーマンス改善を目的としたファイルシステムの設定
6.4.7.1. XFS チューニング
6.4.7.1.1. フォーマットオプション
$ man mkfs.xfs
- ディレクトリーのブロックサイズ
- ディレクトリーのブロックサイズは I/O 動作ごとに読み出したり修正したりするディレクトリー情報の量に影響を与えます。ディレクトリーブロックサイズの最小値はファイルシステムのブロックサイズになります (デフォルト 4 KB)。また最大値は
64KB になります。所定のブロックサイズの場合、サイズが大きいディレクトリーの方が小さいディレクトリーより多くの I/O を必要とします。またディレクトリーのブロックサイズが大きいシステムの方が小さいサイズより I/O 動作ごとの処理能力の消費量が高くなります。したがってディレクトリーのサイズ、ディレクトリーブロックサイズ共にできるだけ小さいサイズにすることを推奨しています。Red Hat では 表6.1「ディレクトリーブロックサイズに対して推奨しているディレクトリーエントリーの最大数」に示すディレクトリーブロックサイズで書き込みが多い作業負荷のエントリー数および読み取りが多い作業負荷のエントリー数を超えない設定を推奨しています。表6.1 ディレクトリーブロックサイズに対して推奨しているディレクトリーエントリーの最大数
ディレクトリーのブロックサイズ 最大エントリー数 (読み取りが多い作業負荷) 最大エントリー数 (書き込みが多い作業負荷) 4 KB 100000–200000 1000000–2000000 16 KB 100000–1000000 1000000–10000000 64 KB >1000000 >10000000 ディレクトリーのブロックサイズによって異なる読み取りや書き込みの作業に与える影響については XFS 提供のドキュメントを参照してください。ディレクトリーのブロックサイズを設定するにはmkfs.xfs -lオプションを使用します。詳細はmkfs.xfsman ページをご覧ください。 - 割り当てグループ
- 割り当てグループは独立した構造でファイルシステムのセクション全体に割り当てられている inode や空領域でインデックスを作成します。各割り当てグループは個別に修正できるため XFS による割り当て動作および割り当て解除の動作は影響するグループが異なる限り同時に行わせることが可能です。したがってファイルシステム内で実行可能な並列動作数は割り当てグループ数と同数になります。ただし、並列動作の実行は動作を行えるプロセッサー数によっても制限されるため割り当てグループ数はシステム内のプロセッサー数と同数またはそれ以上にすることを推奨しています。ひとつのディレクトリーを複数の割り当てグループで同時に変更することはできません。したがって多数のファイルを作成したり削除するアプリケーションには一つのディレクトリーに全てのファイルを保存させないようにすることを推奨しています。割り当てグループを設定するには
mkfs.xfs -dオプションを使用します。詳細はmkfs.xfsの man ページをご覧ください。 - 増大に関する制約
- フォーマットを行った後にファイルシステムのサイズを大きくする必要が生じた場合 (ハードウェアの追加やシンプロビジョニング)、一旦フォーマットを完了した割り当てグループのサイズは変更できないため初期のファイルレイアウトに十分注意してください。割り当てグループのサイズ決定は初期のファイルシステム容量ではなく最終的な容量に応じて行ってください。完全に増大し切った状態のファイルシステムの割り当てグループ数はその最大サイズ (1 TB) に達しない限り 200 から 300 以内に収まるようにします。したがって、ほとんどのファイルシステムで増大可能な推奨最大サイズは初期サイズの 10 倍になります。RAID アレイでファイルシステムを増大させる場合、新しい割り当てグループのヘッダーが追加したストレージに正しく合うようデバイスのサイズを割り当てグループサイズの倍数にする必要があるため更に注意が必要です。また、新しいストレージには既存ストレージと同じ配列を持たせる必要があります。フォーマット後は配列を変更することができないため、同じブロックデバイスに異なる配列のストレージがある場合は最適化が行えません。
- inode とインライン属性
- inode に十分な領域がある場合は inode への属性名と値の書き込みを XFS で直接行うことができます。こうしたインライン属性の読み出しや変更は余分な I/O が必要ないため別々の属性ブロックの読み出しに比べ 10 倍速くなります。デフォルトの inode サイズは 256 バイトです。属性の格納に使用できるのはこのうちの約 100 バイトのみ、inode に格納されるデータエクステントポインター数により異なります。ファイルシステムをフォーマットする際に inode サイズを増やすと属性の格納に使用できる領域サイズが増加します。属性名および属性値はいずれも最大サイズ 254 バイトに制限されています。属性名か属性値のいずれかの長さが 254 バイトを超えるとその属性は別の属性ブロックにプッシュされインラインには格納されなくなります。inode パラメーターを設定するには
mkfs.xfs -iオプションを使用します。詳細はmkfs.xfsの man ページをご覧ください。 - RAID
- ソフトウェア RAID を使用している場合は
mkfs.xfsで自動的にベースとなるハードウェアが適切なストライプ単位とストライプ幅に設定されます。しかし、ハードウェア RAID を使用している場合はハードウェア RAID が必ずしもすべてこの情報をエクスポートするとは限らないため手作業によるストライプ単位とストライプ幅の設定が必要な場合があります。設定を行う場合はmkfs.xfs -dオプションを使用します。詳細はmkfs.xfsの man ページをご覧ください。 - ログサイズ
- 保留中の変更はログに書き込みが行われる同期イベントの発生までメモリー内に集められます。ログのサイズにより同時に処理できる並列の変更数が決定します。また、メモリー内に集めることができる変更の最大サイズも決定するため、ログ記録したデータがディスクに書き込まれる頻度も決定されます。ログが小さいほどデータのディスクへの書き込み頻度は多くなります。ただし、大きいログはそれだけ保留中の変更を記録するため大きくのメモリーを使用するため、メモリーに制限があるシステムの場合はログを大きくしても意味がありません。ログはベースとなるストライブの単位と合わせるとパフォーマンスが良くなります。つまり、ログがストライプ単位の境界線で開始や終了を行うためです。ログをストライプ単位に合わせるには
mkfs.xfs -dオプションを使用します。詳細はmkfs.xfsの man ページをご覧ください。ログサイズを設定するには以下のmkfs.xfsオプションを使用します。logsize にはログのサイズを入力します。# mkfs.xfs -l size=logsize
詳細についてはmkfs.xfsの man ページをご覧ください。$ man mkfs.xfs
- ログのストライプ単位
- RAID5 や RAID6 レイアウトを使用するストレージデバイスに書き込みを行うログの場合、ストライプ単位の境界線で書き込みの開始や終了を行わせるとパフォーマンスが良くなります (ベースとなるストライプ単位にあわせる)。
mkfs.xfsを使用すると自動的に適切なログのストライブ単位への設定が試行されます。ただし、この情報をエクスポートしている RAID デバイスによります。同期イベントが非常に頻繁に発生するような作業の場合、ログのストライプ単位を大きく設定するとパフォーマンスが低下する場合があります。書き込みが小さい場合、1 ログストライプのサイズを埋める必要があるため待ち時間が増えることがあるためです。ログ書き込みの待ち時間で制約を受ける作業の場合は、Red Hat では、ログのストライプ単位を 1 ブロックに設定して、アラインされていないログの書き込み開始を可能とすることを推奨しています。対応しているログのストライプ単位の最大サイズはログのバッファサイズの最大値です (256 KB)。これによりベースとなるストレージにログに設定できるストライプ単位より大きいストライプ単位を持たせることができます。この場合、mkfs.xfsにより警告が発せられログのストライプ単位には 32 KB が設定されます。ログのストライプ単位を設定するには以下のいずれかのオプションを使用します。N にはストライプ単位として使用するブロック数を入力します。size にはストライプ単位のサイズを KB で入力します。mkfs.xfs -l sunit=Nb mkfs.xfs -l su=size
詳細についてはmkfs.xfsの man ページをご覧ください。$ man mkfs.xfs
6.4.7.1.2. マウントオプション
- Inode 割り当て
- compress=zlib – 高い圧縮率。これはデフォルト値であり、古いカーネルの場合は安全です。
- compress=lzo – 圧縮は速く行われますが、zlib ほど圧縮率が高くありません。
- compress=no – 圧縮を無効にします。
- compress-force=method – 動画やディスクイメージなどの圧縮率が高くないファイルにも圧縮を有効にします。このオプションは compress-force=zlib と compress-force=lzo です。
1 TB を超えるサイズのファイルシステムの場合、inode 割り当ての使用を強く推奨します。inode64パラメーターを使用すると XFS が inode とデータをファイルシステム全体に割り当てるよう設定されます。これにより inode の多くがファイルシステムの先頭に割り当てられるのを防ぎ、データの多くがファイルシステムの後方に割り当てられるようになります。- ログのバッファサイズと数
- ログバッファが大きいほどログにすべての変更を書き込む際に要する I/O 動作数が少なくなります。大きなログバッファは I/O 使用が多い作業で非揮発性の書き込みキャッシュがないシステムのパフォーマンスを改善します。ログのバッファサイズは
logbsizeマウントオプションで設定、ログバッファに格納できる情報量の最大値を定義します。ログのストライプ単位を設定していない場合はバッファの書き込みは最大値より短くなるため、同期の多い作業に対してはログのバッファサイズを小さくする必要はありません。ログバッファのデフォルトサイズは 32 KB です。最大サイズは 256 KB です。これ以外に対応しているサイズは 64 KB、128 KB、または 32 KB から 256 KB のあいだのログストライプ単位の 2 の累乗の倍数です。ログバッファ数はlogbufsマウントオプションで指定します。デフォルト値は 8 ログバッファ (最大) ですが最小では 2 ログバッファを指定することができます。余分なログバッファにメモリーを割り当てる余裕のないメモリー制約のあるシステム以外、通常はログバッファ数を減らす必要はありません。ログバッファ数を減らすとログのパフォーマンスが低下する傾向があります。特にログの I/O 待ち時間に制約のある作業に顕著に見られます。 - 変更のログ記録の遅延
- XFS にはログに変更を書き込む前にメモリーにその変更を集めておくことができるオプションがあります。
delaylogパラメーターを使うと頻繁に変更されるメタデータは変更の度にログに書き込むのではなく、定期的なログへの書き込みを行わせることができるようになります。このオプションを使用するとクラッシュで失う可能性のある動作数が増え、またメタデータの追跡に使用するメモリー量も増加します。ただし、メタデータの変更速度やスケーラビリティーが 10 倍向上されるため、fsync、fdatasync、syncなどを使ってデータとメタデータのディスクへの書き込みを確実に行わせる場合にデータやメタデータの整合性を損うことがありません。
6.4.7.2. ext4 のチューニング
6.4.7.2.1. フォーマットオプション
- Inode テーブルの初期化
- ファイルシステム内のすべての inode を初期化するときに、非常に大きいファイルシステムではかなりの時間がかかる場合があります。デフォルトでは、初期化のプロセスは保留になります (レイジー inode テーブルの初期化が有効)。ただし、システムに ext4 ドライバーがない場合は、レイジー inode テーブルの初期化がデフォルトでは無効になります。
lazy_itable_initを 1 に設定すると有効になります。このような場合、カーネルのプロセスはファイルシステムがマウントされるとその初期化を続行します。
mkfs.ext4 の man ページをご覧ください。
$ man mkfs.ext4
6.4.7.2.2. マウントオプション
- Inode テーブル初期化の割合
- レイジー inode テーブルの初期化が有効になっている場合は
init_itableパラメーターの値を指定することで初期化が起こる割合を制御することができます。バックグラウンドでの初期化にかかる時間はほぼ 1 をこのパラメーターの値で割った数値になります。デフォルト値は10です。 - ファイルの自動同期
- 既存ファイル名の変更を行ったり、ファイルの短縮や書き直しをすると
fsyncが正しく動作しないアプリケーションがあります。ext4 の場合、デフォルトではこうした動作の後には必ず自動的にファイルの同期が行われます。ただしこのファイルの自動同期は時間がかかる場合があります。ここまでの同期を必要としない場合はマウント時にnoauto_da_allocオプションを指定するとこの動作を無効にすることができます。noauto_da_allocを設定する場合、データの整合性を確保するにはアプリケーション側で明示的に fsync を使用する必要があります。 - ジャーナル I/O の優先度
- ジャーナル I/O の優先度はデフォルトでは通常の I/O より若干高い
3です。マウント時にjournal_ioprioパラメーターを使ってジャーナル I/O の優先度を制御することができます。journal_ioprioに指定できる値は0から7の範囲です。0が最も優先度の高い I/O になります。
mount の man ページをご覧ください。
$ man mount
6.4.7.3. Btrfs のチューニング
データ圧縮
compress=zlib– 圧縮率が高く、古いカーネルに安全なデフォルトオプション。compress=lzo– 圧縮は高速ですが、zlib よりも低速です。compress=no– 圧縮を無効にします。compress-force=method– 動画やディスクイメージなどの圧縮率が高くないファイルにも圧縮を有効にします。利用可能な方法はzlibとlzoです。
zlib または lzo に置き換えたあとでこのコマンドを実行します。
$ btrfs filesystem defragment -cmethod
lzo を使用してファイルを再圧縮するには、次のコマンドを実行します。
$ btrfs filesystem defragment -r -v -clzo /
6.4.7.4. GFS2 のチューニング
- ディレクトリーの間隔
- GFS2 マウントポイントの最上位レベルのディレクトリー内に作成されるディレクトリーはすべて自動的に間隔が置かれ、断片化を低減すると共にディレクトリー内での書き込み速度を速めています。最上位レベルのディレクトリー同様別のディレクトリーノ間隔も空ける場合は以下に示すように
T属性でそのディレクトリーに印を付けます。dirname には間隔を空けるディレクトリーのパスを入力します。# chattr +T dirname
chattrは e2fsprogs パッケージの一部として提供されます。 - 競合を減らす
- GFS2 はクラスター内のノード間で通信を必要とする可能性があるグローバルロックのメカニズムを使用します。複数のノード間でファイルやディレクトリーの競合が起きるとパフォーマンスの低下を招きます。複数のノード間で共有するファイルシステムの領域をできるだけ小さくすることでキャッシュ間の無効化を招く危険性を最小限に抑えることができます。
第7章 ネットワーク
7.1. 留意事項
/proc/sys/net/core/dev_weight で指定) が転送されるまで続けられます。
tuned、チューニングデーモン、numad NUMA デーモン、CPU の電源状態、割り込みの分散、一時停止フレーム、割り込みの統合、アダプターキュー (netdev バックログ)、アダプター RX および TX バッファー、アダプター TX キュー、モジュールパラメーター、アダプターオフロード、ジャンボフレーム、TCP および UDP プロトコルチューニング、ならびに NUMA ローカリティー。
7.1.1. チューニングを行う前に
7.1.2. パケット受信におけるボトルネック
- NIC ハードウェアバッファまたはリングバッファ
- 大量のパケットがドロップされるとハードウェアバッファがボトルネックとなる場合があります。ドロップされたパケットを監視する方法については「ethtool」を参照してください。
- ハードウェアまたはソフトウェアの割り込みキュー
- 割り込みにより待ち時間が増大しプロセッサーの競合を招く場合があります。プロセッサーで割り込みがどのように処理されるかについては「IRQ (Interrupt Request ー 割り込み要求) の処理」を参照してください。システムで割り込み処理を監視する方法については「/proc/interrupts」を参照してください。割り込み処理に影響を与える設定オプションについては「割り込みの親和性の設定」を参照してください。
- アプリケーションのソケット受信キュー
- 要求しているアプリケーションに対して多数のパケットがコピーされない場合、
/proc/net/snmpの UDP 入力エラー (InErrors) が増加する場合などはアプリケーションの受信キューでのボトルネックを示しています。こうしたエラーを監視する方法については「ss」および「/proc/net/snmp」を参照してください。
7.2. パフォーマンスの問題の監視と診断
7.2.1. ss
$ man ss
7.2.2. ip
ip monitor では引き続きデバイス、アドレス、ルートなどの状態を監視することができます。
$ man ip
7.2.3. dropwatch
$ man dropwatch
7.2.4. ethtool
ethtool -S に監視したいデバイス名を付けて使用するとそのデバイスのカウンターの状態を表示させることができます。
$ ethtool -S devname
$ man ethtool
7.2.5. /proc/net/snmp
/proc/net/snmp には IP、ICMP、TCP、UDP などの監視と管理のため snmp エージェントで使用されるデータが表示されます。このファイルを定期的にチェックして普段とは異なる値がないかを確認、パフォーマンス関連の問題となる可能性が潜んでいないか確認することができます。たとえば、/proc/net/snmp の UDP 入力エラー (InErrors) が増えている場合はソケット受信キューでの障害を示している可能性があります。
7.2.6. SystemTap を使ったネットワークの監視
/usr/share/doc/systemtap-client/examples/network ディレクトリーにインストールされます。
nettop.stp- 5 秒ごとにプロセス一覧 (プロセス ID とコマンド)、送受信したパケット数、プロセスによって送受信されたデータ量を出力します。
socket-trace.stp- Linux カーネルの
net/socket.cファイル内の各関数をインストルメント化して、追跡データを出力します。 dropwatch.stp- 5 秒ごとにカーネル内の場所で解放されたソケットバッファ数を出力します。シンボリック名を表示させる場合は
--all-modulesオプションを使用します。
latencytap.stp スクリプトは異なるタイプの待ち時間が 1 つ以上のプロセスに与える影響を記録します。30 秒ごとに待ち時間タイプの一覧がプロセスの待機した合計時間の降順 (待機時間が長い順) に分類されて出力されます。ストレージやネットワーク両方の待ち時間の原因を特定する際に役に立ちます。Red Hat では、待ち時間イベントの原因が特定できるようこのスクリプトには --all-modules オプションを使用することを推奨しています。デフォルトではこのスクリプトは /usr/share/doc/systemtap-client-version/examples/profiling ディレクトリーにインストールされます。
7.3. 設定ツール
7.3.1. ネットワークパフォーマンス向けの tuned-adm プロファイル
- latency-performance
- network-latency
- network-throughput
7.3.2. ハードウェアバッファの設定
- 入力トラフィックの速度を落とす
- 着信トラフィックにフィルターをかける、参加するマルチキャストグループ数を減らす、キュー待ちの割合を減らすためブロードキャストのトラフィック量を減らすなどの選択肢があります。着信トラフィックにフィルターをかける方法については『Red Hat Enterprise Linux 7 セキュリティーガイド』を参照してください。マルチキャストグループについては Red Hat Enterprise Linux 7 のクラスタリング関連のドキュメントを参照してください。ブロードキャストのトラフィックの詳細については『Red Hat Enterprise Linux 7 システム管理者のガイド』または設定するデバイスに関連するドキュメントを参照してください。Red Hat Enterprise Linux 7 に関連するドキュメントはすべて https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/ でご覧いただくことができます。
- ハードウェアバッファキューのサイズ変更
- キューのサイズを大きくすることでドロップされてしまうパケット数を減らしオーバーフローを防ぎます。ethtool コマンドでネットワークデバイスの rx/tx パラメーターを修正します。
# ethtool --set-ring devname value
- キューの排出の割合を変更する
- デバイス加重はデバイスで一度 (スケジュールされているプロセッサーのアクセス 1 回) に受信できるパケット数を参照します。
dev_weightパラメーターで管理されているデバイス加重を増やすことでキューが排出される割合を増加させることができます。一時的に変更する場合は/proc/sys/net/core/dev_weightファイルの内容を編集します。永続的に変更する場合は procps-ng パッケージで提供される sysctl を使って変更します。
7.3.3. 割り込みキューの設定
7.3.3.1. ビジーポーリングの設定
sysctl.net.core.busy_pollを0以外の値に設定します。このパラメーターはソケットのポーリングと選択用デバイスキューでパケットを待機する時間を管理します (マイクロ秒単位)。Red Hat では50の設定を推奨しています。SO_BUSY_POLLソケットオプションをソケットに追加します。
sysctl.net.core.busy_read のパラメーターも 0 以外の値に設定する必要があります。このパラメーターはソケットの読み取り用デバイスキューでパケットを待機する時間を管理します (マイクロ秒単位)。また、SO_BUSY_POLL オプションのデフォルト値も設定されます。Red Hat ではソケット数が少ない場合は 50、ソケット数が多い場合は 100 の設定を推奨しています。ソケット数が非常に多くなる場合は (数百以上) 代わりにepoll を使用します。
- bnx2x
- be2net
- ixgbe
- mlx4
- myri10ge
# ethtool -k device | grep "busy-poll"
busy-poll: on [fixed] が返された場合はそのデバイスでビジーポーリングを使用することができます。
7.3.4. ソケット受信キューの設定
- 着信トラフィックの速度を低下させる
- パケットがキューに到達する前にフィルターをかけたりドロップする、またはデバイスの加重を低くするなどの方法でキューが満杯になる割合を低下させます。
- アプリケーションのソケットキューの深さを増やす
- 限られたトラフィック量を集中的に受信するようなソケットキューの場合、その集中的なトラフィック量に合うようソケットキューの深さを増やすとパケットがドロップされなくなる場合があります。
7.3.4.1. 着信トラフィックの速度を低下させる
dev_weight パラメーターで管理します。一時的に変更する場合は /proc/sys/net/core/dev_weight ファイルの内容を編集します。永続的に変更する場合は procps-ng パッケージで提供される sysctl を使って変更します。
7.3.4.2. キューの深さを増やす
- /proc/sys/net/core/rmem_default の値を増やす
- このパラメーターにより、ソケットで使用される受信バッファーのデフォルトサイズを制御します。この値は
/proc/sys/net/core/rmem_maxの値以下にする必要があります。 - setsockopt を使って SO_RCVBUF に大きな値を設定する
- このパラメーターにより、ソケットの受信バッファーの最大サイズを制御します (バイト単位)。
getsockoptシステムコールを使ってバッファーの現在の値を決定します。この詳細については、socket(7) man ページをご覧ください。
7.3.5. RSS (Receive-Side Scaling) の設定
/proc/interrupts 内でそのインターフェースに関連付けられているかどうかチェックします。たとえば、p1p1 インターフェイスを確認する場合は以下を実行します。
# egrep 'CPU|p1p1' /proc/interrupts CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 89: 40187 0 0 0 0 0 IR-PCI-MSI-edge p1p1-0 90: 0 790 0 0 0 0 IR-PCI-MSI-edge p1p1-1 91: 0 0 959 0 0 0 IR-PCI-MSI-edge p1p1-2 92: 0 0 0 3310 0 0 IR-PCI-MSI-edge p1p1-3 93: 0 0 0 0 622 0 IR-PCI-MSI-edge p1p1-4 94: 0 0 0 0 0 2475 IR-PCI-MSI-edge p1p1-5
p1p1 インターフェイスに 6 つの受信キューが作成されたことを示しています (p1p1-0 から p1p1-5)。また、各キューでいくつの割り込みが処理されたか、どの CPU が割り込みを処理したかも示しています。この例の場合、システムには 6 つの CPU があり、この NIC ドライバーはデフォルトで 1 CPU ごと 1 つのキューを作成するためキューが 6 つ作成されています。NIC ドライバーの中では般的なパターンです。
ls -1 /sys/devices/*/*/device_pci_address/msi_irqs の出力をチェックすることもできます。たとえば、PCI アドレスが 0000:01:00.0 のデバイスをチェックするには、以下のコマンドを実行するとそのデバイスの割り込み要求キューを一覧表示できます。
# ls -1 /sys/devices/*/*/0000:01:00.0/msi_irqs 101 102 103 104 105 106 107 108 109
bnx2x ドライバーは num_queues、sfc ドライバーは rss_cpus パラメーターで設定されます。いずれにしても、通常は /sys/class/net/device/queues/rx-queue/ で設定されます。device はネットワークデバイスの名前 (eth1 など)、rx-queue は該当する受信キューの名前になります。
ethtool --show-rxfh-indir および --set-rxfh-indir パラメーターを使ってネットワークアクティビティーの配分方法を修正したり、特定タイプのネットワークアクティビティーを他より重要なアクティビティーとして加重することもできます。
irqbalance デーモンを RSS と併用するとノード間メモリー転送やキャッシュラインバウンスの可能性が低減されます。ネットワークパケット処理の待ち時間が少なくなります。
7.3.6. 受信パケットステアリング (RPS) の設定
- RPS はすべてのネットワークインターフェースカードで使用できます。
- 新たなプロトコルに対応するようソフトウェアフィルターを簡単に追加することができます。
- ネットワークデバイスのハードウェア割り込み率は上がりません。ただし、プロセッサー間の割り込みが生まれます。
/sys/class/net/device/queues/rx-queue/rps_cpus ファイル内でネットワークデバイスおよび受信キューごとに設定されます。device はネットワークデバイスの名前 (eth0 など)、rx-queue は該当する受信キューの名前です (rx-0 など)。
rps_cpus ファイルのデフォルト値は 0 です。この値の場合は RPS は無効です。したがってネットワーク割り込みを処理する CPU がパケットも処理します。
rps_cpus を設定します。
rps_cpus ファイルはコンマで区切った CPU ビットマップを使用します。つまり、CPU にインターフェース上の受信キューの割り込みを処理させるには、ビットマップ上の CPU 位置の値を 1 に設定します。たとえば、CPU 0、1、2、および 3 で割り込みを処理する場合は rps_cpus の値を f (15 の 16 進数表記) に設定します。2 進数表記では、15 は 00001111 (1+2+4+8) で表されます。
7.3.7. RFS (Receive Flow Steering) の設定
/proc/sys/net/core/rps_sock_flow_entries- このファイルの値を同時にアクティブになるであろう接続の予測最大数に設定します。適度なサーバー負荷の場合は
32768の設定値を推奨しています。入力した値はすべて直近の 2 の累乗で切り上げられます。 /sys/class/net/device/queues/rx-queue/rps_flow_cnt- device は設定するネットワークデバイス名 (
eth0など)、rx-queue は設定する受信キューになります (rx-0など)。rps_sock_flow_entriesをNで割った値をこのファイルの値に設定します。Nはデバイス上の受信キューの数です。たとえば、rps_flow_entriesが32768に設定されていて設定済みの受信キューが 16 ある場合、rps_flow_cntは2048に設定します。単一キューデバイスの場合はrps_flow_cntの値はrps_sock_flow_entriesの値と同じになります。
numactl または taskset を使用してアプリケーションを特定のコア、ソケット、または NUMA ノードに固定することを検討してみてください。これにより、パケットが間違った順番で処理されることを防ぐことができます。
7.3.8. アクセラレート RFS の設定
- アクセラレート RFS がネットワークインターフェースカード対応になっていること。アクセラレート RFS は
ndo_rx_flow_steer()netdevice関数をエクスポートするカードでサポートされています。 ntupleフィルタリングが有効になっていること。
付録A ツールについて
A.1. irqbalance
--oneshot オプションで 1 度だけの実行も可能です。
- --powerthresh
- CPU が省電力モードになる前にアイドル状態になることが可能な CPU 数を設定します。しきい値を超える CPU 数が平均 softirq ワークロードを 1 標準偏差以上下回り、平均値から 1 標準偏差を超える CPU がなく、複数の irq がこれらに割り当てられている場合、CPU は省電力モードに入ります。このモードでは、CPU は irq バランシングの一部ではないので、不必要に再開されることがありません。
- --hintpolicy
- irq カーネル親和性ヒントの処理方法を決定します。
exact(irq 親和性ヒントを常に適用)、subset(irq は均等に分散されるが割り当てオブジェクトは親和性ヒントのサブセット)、またはignore(irq 親和性ヒントを完全に無視) の値を使用できます。 - --policyscript
- 各割り込み要求に実行するスクリプトの場所を定義します。引数として渡される irq 番号とデバイスパス、irqbalance で期待されるゼロ終了コードを付けます。定義されたスクリプトでは、渡された irq の管理で irqbalance をガイドするために、ゼロもしくはそれ以上の鍵と値のペアを指定することができます。有効な鍵の値のペアとして認識されるのは、以下のものです。
- ban
- 有効な値は、
true(渡された irq をバランシングから除外) もしくはfalse(この irq でバランシングを実施) です。 - balance_level
- 渡された irq のバランスレベルをユーザーが上書きできるようにします。デフォルトでは、バランスレベルは irq を所有するデバイスの PCI デバイスクラスに基づきます。有効な値は
none、package、cache、またはcoreになります。 - numa_node
- 渡された irq にはローカルとみなされる NUMA ノードを、ユーザーが上書きできるようにします。ローカルノードについての情報が ACPI で指定されていない場合は、デバイスはすべてのノードから等距離とみなされます。有効な値は、特定の NUMA ノードを識別する整数 (0 から)、および irq が全ノードから等距離であるとみなすことを指定する
-1になります。
- --banirq
- 指定割り込み要求番号を持つ割り込みが禁止割り込み一覧に追加されます。
IRQBALANCE_BANNED_CPUS 環境変数を使って irqbalance に無視される CPU のマスクを指定することもできます。
$ man irqbalance
A.2. Tuna
tuna を実行すると起動します。
tuna --socket 0 --isolate \ --thread my_real_time_app --move \ --irq serial --socket 1 --move \ --irq eth* --socket 2 --spread \ --show_threads --show_irqs
- --gui
- グラフィカルユーザーインターフェースを起動します。
- --cpus
- Tuna で管理する CPU をコンマで区切った一覧をとります。新しい一覧を指定するまでこの一覧が有効になります。
- --config_file_apply
- システムに適用するプロファイル名をとります。
- --config_file_list
- プレロードされるプロファイルを表示します。
- --cgroup
--show_threadsと併用します。管理グループを有効にした場合に、--show_threadsで表示されるプロセスが属する管理グループタイプを表示します。-P が必要です。- --affect_children
- 指定すると Tuna は子スレッド、親スレッド両方に影響します。
- --filter
- 選択された CPU の表示を --gui で無効にします。-c が必要です。
- --isolate
- CPU のコンマで区切った一覧を取得します。Tuna により指定 CPU からの全スレッドの移行が行われます。-c または -s が必要です。
- --include
- CPU のコンマで区切った一覧を取得します。Tuna により指定 CPU での全スレッドの実行が許可されます。-c または -s が必要です。
- --no_kthreads
- このパラメーターを指定すると Tuna はカーネルスレッドには作用しなくなります。
- --move
- 選択したエンティティーを CPU 一覧に移動します。-c または -s が必要です。
- --priority
- スレッドの優先度とスケジューラーのポリシーを指定します。使用できるスケジューラーポリシーは
OTHER、FIFO、RR、BATCH、IDLEになります。ポリシーがFIFOまたはRRの場合、有効な優先度の値は 1 (最も低い) から 99 (最も高い) の間の整数になります。デフォルト値は1です。たとえば、tuna --threads 7861 --priority=RR:40の場合、ポリシーにはRR(ラウンドロビン)、優先度には40がスレッド7861に設定されます。ポリシーがOTHER、BATCH、またはIDLEの場合、唯一の有効な優先度の値は0です (これはデフォルト値でもあります)。-t が必要です。 - --show_threads
- スレッド一覧を表示します。
- --show_irqs
- IRQ 一覧を表示します。
- --irqs
- Tuna を作用させる IRQ のコンマで区切った一覧をとります。新しい一覧を指定するまでこの一覧が有効になります。一覧に IRQ を追加する場合は
+、一覧から削除する場合は-を使用します。 - --save
- 指定ファイルにカーネルスレッドのスケジュールを保存します。
- --sockets
- Tuna に管理させる CPU ソケットのコンマで区切った一覧をとります。このオプションはひとつのプロセッサーキャッシュを共有するコアや同じ物理チップにあるコアなどシステムのテクノロジーを考慮に入れています。
- --threads
- Tuna に管理させるスレッドのコンマで区切った一覧をとります。新しい一覧を指定するまでこの一覧が有効になります。一覧にスレッドを追加する場合は
+、一覧から削除する場合は-を使用します。 - --no_uthreads
- 動作がユーザーのスレッドに作用しないようにします。
- --what_is
- 選択したエンティティーの詳細なヘルプを表示します。-t が必要です。
- --spread
--threadsで指定したスレッドを--cpusで指定した CPU 間で均等に分散します。t または -q が必要です。- --help
- オプションの一覧を出力します。このアクション後に tuna は終了し、コマンドラインの残りは無視されます。
- --version
- バージョンを表示します。
A.3. ethtool
$ man ethtool
A.4. ss
ss -tmpie があります。すべての TCP ソケット (t)、内部 TCP 情報 (i)、ソケットのメモリー使用量 (m)、ソケットを使用しているプロセス (p)、ソケット情報の詳細 (i) などを表示します。
$ man ss
A.5. tuned
/etc/tuned/tuned-main.conf ファイルの dynamic_tuning パラメーターを編集します。また update_interval パラメーターで tuned のチェック使用とチューニング詳細の更新の間隔を秒単位で設定することもできます。
$ man tuned
A.6. tuned-adm
tuned-adm recommend) も提供しています。このサブコマンドはインストール時にシステムのデフォルトプロファイルを設定するためデフォルトのプロファイルに戻りたい場合に使用することができます。
include パラメーターが用意されるため、既存のプロファイルに基づいて独自の tuned-adm プロファイルを使用できるようになります。
- throughput-performance
- 処理能力の改善に焦点をあてたサーバープロファイルになります。デフォルトのプロファイルでほとんどのシステムに推奨となります。このプロファイルでは、
intel_pstateとmin_perf_pct=100を設定することにより、節電よりもパフォーマンスが優先されます。Transparent Huge Page が有効になり、cpupower を使用してperformancecpufreq ガバナーが設定され、入出力スケジューラーがdeadlineに設定されます。また、kernel.sched_min_granularity_nsが10μs、kernel.sched_wakeup_granularity_nsが、15μs、vm.dirty_ratioが40% に設定されます。 - latency-performance
- 待ち時間の短縮に焦点をあてたサーバープロファイルです。c-state チューニングや Transparent Huge Page の TLB 効率性の改善を目的とする待ち時間に制約のある作業負荷に推奨のプロファイルです。
intel_pstateとmax_perf_pct=100を設定して節電よりパフォーマンスを重視します。透過的な大規模ページを有効にし、cpupower を使ってperformancecpufreq ガバナーを設定、cpu_dma_latency値に1を要求します。 - network-latency
- ネットワークの待ち時間短縮に焦点をあてたサーバープロファイルです。このプロファイルでは、
intel_pstateとmin_perf_pct=100を設定することにより、節電よりパフォーマンスが優先されます。透過的な巨大ページと NUMA 自動負荷分散が無効になります。また、cpupower を使用してperformancecpufreq ガバナーが設定され、1のcpu_dma_latency値が要求されます。さらに、busy_readとbusy_pollの時間が50μs、tcp_fastopenが3に設定されます。 - network-throughput
- ネットワーク処理能力の改善に焦点をあてたサーバープロファイルです。
intel_pstateとmax_perf_pct=100を設定しカーネルのネットワークバッファサイズを大きくして節電よりパフォーマンスを重視します。透過的な大規模ページを有効にし、cpupower を使ってperformancecpufreq ガバナーを設定します。また、kernel.sched_min_granularity_nsを10μs にkernel.sched_wakeup_granularity_nsを 15 μs にvm.dirty_ratioを40% にそれぞれ設定します。 - virtual-guest
- Red Hat Enterprise Linux 7 仮想マシンと VMware ゲストでのパフォーマンスの最適化に焦点をあてたプロファイルです。
intel_pstateとmax_perf_pct=100を設定して節電よりパフォーマンスを重視します。また仮想マシンの swap を低減します。透過的な大規模ページを有効にし、cpupower を使ってperformancecpufreq ガバナーを設定します。kernel.sched_min_granularity_nsを10μs にkernel.sched_wakeup_granularity_nsを 15 μs にvm.dirty_ratioを40% にそれぞれ設定します。 - virtual-host
- Red Hat Enterprise Linux 7 仮想ホストでのパフォーマンスの最適化に焦点をあてたプロファイルです。
intel_pstateとmax_perf_pct=100を設定して節電よりパフォーマンスを重視します。また仮想マシンの swap を低減します。透過的な大規模ページを有効にしダーティーなページをより頻繁にディスクに書き戻します。cpupower を使ってperformancecpufreq ガバナーを設定します。kernel.sched_min_granularity_nsを10μs にkernel.sched_wakeup_granularity_nsを 15 μs にkernel.sched_migration_costを5μs にvm.dirty_ratioを40% にそれぞれ設定します。
$ man tuned-adm
A.7. perf
- perf stat
- 実行された指示や消費したクロックサイクルなど、一般的なパフォーマンスイベントに関する総体的な統計を提供します。デフォルトの測定イベント以外のイベントに関する統計を収集する場合はオプションフラグを使用することができます。Red Hat Enterprise Linux 6.4 からは
perf statを使って 1 コントロールグループ (cgroups) または複数のコントロールグループに応じてモニタリングにフィルターをかけることができるようになります。詳細については man ページをご覧ください。$ man perf-stat
- perf record
- このコマンドでパフォーマンスデータをファイルに記録し、後で
perf reportを使って分析を行うことができます。詳細については man ページをご覧ください。$ man perf-record
- perf report
- ファイルからパフォーマンスデータを読み取り、記録されたデータの分析を行います。詳細については man ページをご覧ください。
$ man perf-report
- perf list
- 特定のマシン上で利用可能なイベントを表示します。これらのイベントは、システムのソフトウェア設定とパフォーマンス監視ハードウェアによって異なります。詳細については man ページをご覧ください。
$ man perf-list
- perf top
- top ツールとよく似た機能を実行します。リアルタイムでパフォーマンスカウンタープロファイルを生成、表示します。詳細については man ページをご覧ください。
$ man perf-top
- perf trace
- strace ツールとよく似た機能を実行します。指定スレッドまたはプロセスで使用されるシステムコールとそのアプリケーションで受信されるすべてのシグナルを監視します。追跡するターゲットを増やすこともできます。全一覧は man ページをご覧ください。
$ man perf-trace
A.8. Performance Co-Pilot (PCP)
表A.1 Red Hat Enterprise Linux 7 で Performance Co-Pilot により配布されるシステムサービス
表A.2 Red Hat Enterprise Linux 7 で Performance Co-Pilot により配布されるツール
A.9. vmstat
- -a
- アクティブなメモリーと非アクティブなメモリーを表示します。
- -f
- 起動時からのフォーク数を表示します。これには
fork、vfork、cloneのシステムコールが含まれ、作成されたタスク数の合計と同じになります。各プロセスはスレッドの使用により 1 タスクまたは複数のタスクで表されます。表示は繰り返されません。 - -m
- スラブ情報を表示します。
- -n
- ヘッダーの出現を定期的ではなく 1 度のみに指定します。
- -s
- 各種イベントのカウンターとメモリー統計の表を表示します。表示は繰り返されません。
- delay
- リポート間の遅延を秒単位で指定します。遅延を指定しない場合はマシンを最後に起動した時点からの平均値のレポートが一つのみ出力されます。
- count
- システムに関するレポートの回数を指定します。count を指定せず delay を指定すると vmstat は無期限で報告を行います。
- -d
- ディスクの統計情報を表示します。
- -p
- パーティション名を値として取り、そのパーティションの詳細な統計情報を報告します。
- -S
- レポートで出力される単位を指定します。
k(1000 バイト)、K(1024 バイト)、m(1000000 バイト)、M(1048576 バイト) の値が使用できます。 - -D
- ディスクの動作に関する概要統計を報告します。
$ man vmstat
A.10. x86_energy_perf_policy
# x86_energy_perf_policy -r
# x86_energy_perf_policy profile_name
- performance
- プロセッサーは省エネのためパフォーマンスを犠牲にはしません。これがデフォルト値です。
- normal
- 大幅な省エネとなる可能性がある場合はマイナーなパフォーマンス低下を許容します。ほとんどのサーバーおよびデスクトップで妥当な設定になります。
- powersave
- 最大限の省エネを目的とし大幅なパフォーマンス低下の可能性を受け入れます。
$ man x86_energy_perf_policy
A.11. turbostat
- pkg
- プロセッサーのパッケージ番号
- core
- プロセッサーのコア番号
- CPU
- Linux CPU (論理プロセッサー) 番号
- %c0
- CPU が指示をリタイアした間隔の割合
- GHz
- この数値が TSC の値よりも大きい場合、CPU はターボモードになります。
- TSC
- 間隔全体を通じたクロック平均速度
- %c1、%c3、および %c6
- プロセッサーが c1、c3、または c6 の各状態だったあいだの間隔の割合
- %pc3 または %pc6
- プロセッサーが pc3 または pc6 の各状態だったあいだの間隔の割合
-i オプションでカウンター結果出力の間隔を指定します。結果を 10 秒ごとに出力させる場合は turbostat -i 10 を実行します。
注記
A.12. numastat
numastat コマンドのデフォルトの追跡カテゴリーを以下に簡単に説明します。
- numa_hit
- 当該ノードへの割り当てに成功したページ数
- numa_miss
- 当初の意図されたノードがメモリー不足だったために当該ノードに割り当てられたページ数、各
numa_missイベントには対応するnuma_foreignイベントが別のノード上にある - numa_foreign
- 当初は当該ノードへの割り当てを意図したもので、別のノードに割り当てられたページ数、
numa_foreignイベントには対応するnuma_missイベントが別のノード上にある - interleave_hit
- 当該ノードへの割り当てに成功したインタリーブポリシーページ数
- local_node
- 当該ノード上でのプロセスによって当該ノードへの割り当てに成功したページ数
- other_node
- 別のノード上でのプロセスによって当該ノードへの割り当てに成功したページ数
- -c
- 表示情報の表を横方向に縮小します。これは、NUMA ノード数が多いシステムでは有用ですが、コラムの幅とコラム間の間隔はあまり予測可能ではありません。このオプションが使用されると、メモリー量は一番近いメガバイトに切り上げ/下げられます。
- -m
- ノードあたりでのシステム全体のメモリー使用量を表示します。
/proc/meminfoにある情報に類似したものです。 - -n
- オリジナルの numastat コマンド (
numa_hit、numa_miss、numa_foreign、interleave_hit、local_node、およびother_node)と同じ情報が表示されますが、測定単位にメガバイトを使用した更新フォーマットが使われます。 - -p pattern
- 指定されたパターンのノードごとのメモリー情報を表示します。pattern の値が数字の場合は、numastat は数値プロセス識別子と仮定します。それ以外の場合は、numastat は指定されたパターンをプロセスコマンドラインで検索します。
-pオプションの値の後に入力されるコマンドライン引数は、フィルターにかける追加のパターンとみなされます。追加のパターンは、フィルターを絞り込むのではなく拡張します。 - -s
- 表示データを降順に並び替え、(total コラムの) メモリー消費量の多いものが最初に表示されます。オプションでは、node を指定すると、表はその node のコラムにしたがって並び替えられます。このオプション使用時には、以下のように node の値は
-sオプションの直後に続けます。numastat -s2
このオプションと値の間に空白スペースを入れないでください。 - -v
- 詳細情報を表示します。つまり、複数プロセスのプロセス情報が各プロセスの詳細情報を表示します。
- -V
- numastat のバージョン情報を表示します。
- -z
- 情報情報から値が 0 の行と列のみを省略します。表示目的で 0 に切り下げられている 0 に近い値は、表示出力から省略されません。
A.13. numactl
- --hardware
- ノード間の相対距離を含む、システム上で利用可能なノードのインベントリーを表示します。
- --membind
- メモリーが特定のノードからのみ割り当てられるようにします。指定された場所に利用可能なメモリーが十分にない場合は、割り当ては失敗します。
- --cpunodebind
- 指定されたコマンドおよびその子プロセスが指定されたノードでのみ実行されるようにします。
- --phycpubind
- 指定されたコマンドおよびその子プロセスが指定されたプロセッサーでのみ実行されるようにします。
- --localalloc
- メモリーが常にローカルノードから割り当てられるよう指定します。
- --preferred
- メモリーを割り当てる元となるノードを指定します。この指定ノードからメモリーが割り当てられない場合は、別のノードがフォールバックとして使用されます。
$ man numactl
A.14. numad
A.14.1. コマンドラインから numad を使用する
# numad
/var/log/numad.log にログ記録されます。アクティビティーは、以下のコマンドで停止されるまで継続されます。
# numad -i 0
# numad -S 0 -p pid
- -p pid
- 指定 pid を明示的な対象一覧に加えます。指定されたプロセスは numad プロセスの重要度しきい地に達するまで管理されません。
- -S 0
- プロセススキャンのタイプを
0に設定し、numad 管理を明示的に対象プロセスに限定します。
$ man numad
A.14.2. numad をサービスとして使用する
/var/log/numad.log にログ記録されます。
# systemctl start numad.service
# chkconfig numad on
$ man numad
A.14.3. プレプレースメントアドバイス
A.14.4. KSM をともなう numad の使用
/sys/kernel/mm/ksm/merge_nodes パラメーターの値を 0 に変更して NUMA ノードにまたがるページのマージを回避します。これを実行しないと、KSM はノードにまたがってページをマージするので、リモートメモリーアクセスが増大します。また、カーネルメモリーが計算した統計情報は、ノード間での大量のマージ後にはそれぞれの間で相反する場合があります。そのため、KSM デーモンが大量のメモリーページをマージすると、numad は利用可能なメモリーの正確な分量と場所について混乱する可能性があります。KSM は、システムにメモリーをオーバーコミットしている場合にのみ、有用なものです。システムに未使用のメモリーが大量にあると、KSM デーモンをオフにして無効にすることでパフォーマンスが高まる場合があります。
A.15. OProfile
opcontrol ツールと新たな operf ツールは相互排他的であることに注意してください。
- ophelp
- システムプロセッサーで使用可能なイベントとその簡単な説明を表示します。
- opimport
- サンプルデータベースファイルをシステム用に外部のバイナリ形式からネイティブの形式に変換します。異なるアーキテクチャからのサンプルデータベースを解析する時にのみこのオプションを使用して下さい。
- opannotate
- アプリケーションがデバッグシンボルでコンパイルされている場合は、実行可能ファイル用の注釈付きのソースを作成します。
- opcontrol
- プロファイリング実行でどのデータが収集されるかを設定します。
- operf
opcontrolの代わりとなる予定です。operfツールは Linux Performance Events Subsystem を使用するので、単一プロセスとしてもシステムワイドとしてもより正確なプロファイリングのターゲットが可能になります。また、システム上でパフォーマンス監視ハードウェアを使用する他のツールと OProfile がよりうまく共存することが可能になります。opcontrolとは異なり、初期設定が不要で、--system-wideオプションを使用していなければ、root 権限なしで使用できます。- opreport
- プロファイルデータを取得します。
- oprofiled
- デーモンとして実行して定期的にサンプルデータをディスクに書き込みます。
opcontrol、oprofiled、および post-processing ツール) は依然使用可能ですが、プロファイリング方法としては推奨されません。
$ man oprofile
A.16. taskset
重要
# taskset -c processors pid
1,3,5-7 のようにプロセッサーの範囲で置き換えます。pid を再構成するプロセスのプロセス識別子で置き換えます。
# taskset -c processors -- application
$ man taskset
A.17. SystemTap
付録B 改訂履歴
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 10.13-50.2 | Tue Mar 13 2018 | ||
| |||
| 改訂 10.13-50.1 | Sun Sep 24 2017 | ||
| |||
| 改訂 10.13-50 | Thu Jul 27 2017 | ||
| |||
| 改訂 10.13-44 | Tue Dec 13 2016 | ||
| |||
| 改訂 10.08-38 | Wed Nov 11 2015 | ||
| |||
| 改訂 0.3-23 | Tue Feb 17 2015 | ||
| |||
| 改訂 0.3-3 | Mon Apr 07 2014 | ||
| |||
