コンテンツにスキップ

「パフォーマンスの向上」の版間の差分

提供: ArchWiki
削除された内容 追加された内容
AshMyzk (トーク | 投稿記録)
AshMyzk (トーク | 投稿記録)
同期
 
(3人の利用者による、間の38版が非表示)
4行目: 4行目:
[[es:Improving performance]]
[[es:Improving performance]]
[[fr:Improving performance]]
[[fr:Improving performance]]
[[hu:Improving performance]]
[[pl:Improving performance]]
[[pt:Improving performance]]
[[pt:Improving performance]]
[[ru:Improving performance]]
[[ru:Improving performance]]
[[zh-hans:Improving performance]]
[[zh-hans:Improving performance]]
{{Related articles start}}
{{Related articles start}}
{{Related|ブートパフォーマンスの向上}}
{{Related|パフォーマンスの向上/ブートプロセス}}
{{Related|Pacman ヒント#パフォーマンス}}
{{Related|Pacman ヒント#パフォーマンス}}
{{Related|OpenSSH#SSH の高速化}}
{{Related|OpenSSH#SSH の高速化}}
15行目: 17行目:
{{Related|Preload}}
{{Related|Preload}}
{{Related articles end}}
{{Related articles end}}

この記事では、知覚または計測できるシステムパフォーマンスの向上を最終目的として、パフォーマンスに関連する基本的なシステム診断、及び、リソース消費量の削減やシステム最適化のための手順に関する情報を提供しています。ゲーミングおよび低レイテンシに特有のその他のアドバイスは [[ゲーム#パフォーマンスを向上させる]] も参照してください。
この記事では、知覚または計測できるシステムパフォーマンスの向上を最終目的として、パフォーマンスに関連する基本的なシステム診断、及び、リソース消費量の削減やシステム最適化のための手順に関する情報を提供しています。ゲーミングおよび低レイテンシに特有のその他のアドバイスは [[ゲーム#パフォーマンスを向上させる]] も参照してください。


36行目: 39行目:
== ストレージデバイス ==
== ストレージデバイス ==


=== セクタサイズ ===
=== 複数のハードウェアパス ===

内部ハードウェアパスは、ストレージデバイスがマザーボードを介してどのように接続されているかを表します。NIC、PCIe、Firewire、Raid カード、USB など、マザーボードを介する接続方法は複数あります。ストレージデバイスを複数の接続点に分けることで、ボトルネックを回避できます。なぜなら、マザーボードに入る「エントリーパス」は「パイプ」のようなもので、そのパイプを一度に通ることのできる量には制限があるからです。通常、マザーボードには複数の「パイプ」が存在するため、これは回避できます。

これの具体例としては、マシン前面に2つの USB ポート、背面に4つの USB ポートがあり、4つのディスクを接続したい場合です。通常、3つのディスクを背面に接続し、残り1つを前面に接続するよりも、2つを前面に接続し、別の2つを背面に接続する方が高速です。これは、ほとんどの場合、前面と背面のポートは内部的に別の Root USB Hub に接続されていて、片方ではなく両方を使用することで同時に送信できるデータが増えるからです。

次のコマンドは、マシンの様々なパスを特性するのに役立ちます。

{{hc|USB デバイスツリー|$ lsusb -t}}


NVMe ドライブや Advanced Format ハードディスクが[[アドバンスドフォーマット|適切な論理セクタサイズ]]を使用していることを確認してください。
{{hc|PCI デバイスツリー|$ lspci -tv}}


=== パーティショニング ===
=== パーティショニング ===
57行目: 52行目:


[[スワップ]]を別のディスク上に作成することでもパフォーマンスを多少向上させることができます。特に、スワップが頻繁に発生する場合です。
[[スワップ]]を別のディスク上に作成することでもパフォーマンスを多少向上させることができます。特に、スワップが頻繁に発生する場合です。

===== SSD を HDD のキャッシュとして使う =====

ハードディスクから移行することができない場合、ソリッドステートドライブをキャッシュレイヤとして使うことで読み書き速度を向上させ、ランダムアクセスによるパフォーマンスの低下を減らすことができます。方法としては、[[LVM#キャッシュ]]、[[Bcache]]、[[Bcachefs#SSD キャッシング]] があります。


==== HDD でのレイアウト ====
==== HDD でのレイアウト ====
70行目: 69行目:
==== マウントオプション ====
==== マウントオプション ====


[[fstab#atime オプション|noatime]] オプションファイルシステムのパフォーマンスを向上させることが知られています。
様々な [[fstab#atime オプション|*atime]] オプション{{ic|strictatime}} のパフォーマンスのペナルティ軽減することができます。


他のマウントオプションはファイルシステム固有なので、ファイルシステムの関連記事を参照してください:
他のマウントオプションはファイルシステム固有なので、ファイルシステムの関連記事を参照してください:
83行目: 82行目:


===カーネルパラメータの調整===
===カーネルパラメータの調整===

ブロックデバイスのパフォーマンスに影響するキーが複数存在します、詳しくは [[sysctl#仮想メモリ]] を見て下さい。
ブロックデバイスのパフォーマンスに影響するキーが複数存在します、詳しくは [[sysctl#仮想メモリ]] を見て下さい。


=== I/O スケジューラの設定 ===
=== I/O スケジューラの設定 ===

==== 背景情報 ====
==== 背景情報 ====

入出力 ''(I/O)'' スケジューラはストレージデバイスにブロック I/O の操作を送信するときの順番を決めるカーネルコンポーネントです。I/O スケジューラの目的は読み込みリクエストを最適な方法で扱うことであるため、以下の2つのドライブの特徴を押さえておくことが重要です:
入出力 ''(I/O)'' スケジューラはストレージデバイスにブロック I/O の操作を送信するときの順番を決めるカーネルコンポーネントです。I/O スケジューラの目的は読み込みリクエストを最適な方法で扱うことであるため、以下の2つのドライブの特徴を押さえておくことが重要です:


* HDD は回転ディスクでありヘッドが物理的に必要な場所に移動します。そのため、ランダムアクセスは 3〜12ms と非常に遅くなります (ハイエンドサーバーのドライブなのかノートパソコンのドライブなのか、あるいはディスコントローラの書き込みバッファを迂回するかなどで速度は変わります)。逆に連続アクセスなら高いスループットを得ることが可能です。連続アクセスならヘッドはほとんど動かなくてよいためです。典型的な HDD は毎秒200回ほどの I/O リクエストを処理することができます ''(IOPS)''。
* HDD は回転ディスクでありヘッドが物理的に必要な場所に移動します。そのため、ランダムアクセスは 3〜12ms と非常に遅くなります (ハイエンドサーバーのドライブなのかノートパソコンのドライブなのか、あるいはディスコントローラの書き込みバッファを迂回するかなどで速度は変わります)。逆に連続アクセスなら高いスループットを得ることが可能です。連続アクセスならヘッドはほとんど動かなくてよいためです。典型的な HDD は毎秒200回ほどの I/O リクエストを処理することができます ''(IOPS)''。


* SSD には物理的に移動する部品がありません。ランダムアクセスはシーケンシャルアクセスと同じ速度が出ます (0.1ms 未満)。SSD は複数のリクエストを一度にこなすこともできます。典型的な SSD のスループットは 10,000 IOPS を超えるため、大抵の場合は必要な仕事量を上回ります。
* SSD には物理的に移動する部品がありません。ランダムアクセスはシーケンシャルアクセスと同じ速度が出ます (0.1ms 未満)。SSD は複数のリクエストを一度にこなすこともできます。典型的な SSD のスループットは 10,000 IOPS を超えるため、大抵の場合は必要な仕事量を上回ります。
97行目: 99行目:
==== スケジューリングアルゴリズム ====
==== スケジューリングアルゴリズム ====


スループットを改善する方法の一つとして、待機リクエストの順番を論理アドレスで並び替えて出来るだけ一番近いリクエストを通すことで、アクセスをリニア化する方法があります。これが [[w:ja:エレベータアルゴリズム|elevator]] スケジューラと呼ばれる Linux の最初の I/O スケジューラでした。
スループットを改善する方法の一つとして、待機リクエストの順番を論理アドレスで並び替えてできるだけ一番近いリクエストを通すことで、アクセスをリニア化する方法があります。これが [[w:ja:エレベータアルゴリズム|elevator]] スケジューラと呼ばれる Linux の最初の I/O スケジューラでした。


エレベータアルゴリズムの問題点はシーケンシャルアクセスをするプロセスが上手く動かなくなることです。そのようなプロセスは、データブロックを読み取って数マイクロ秒で処理してから次のブロックを読み出します。エレベータスケジューラはプロセスが近くのブロックを呼びだそうとしていることを知らないため、他の場所のリクエストに移ってしまいます。この問題を解決するために [[w:Anticipatory_scheduling|anticipatory]] IO スケジューラが追加されま同期リクエストの場合、このアルゴリズムでは他のリクエストに移で数ミリ秒待機します。
エレベータアルゴリズムの問題点はシーケンシャルアクセスをするプロセスが上手く動かなくなることです。そのようなプロセスは、データブロックを読み取って数マイクロ秒で処理してから次のブロックを読み出します。エレベータスケジューラはプロセスが近くのブロックを呼びだそうとしていることを知らないため、他の場所のリクエストに移ってしまいます。[[w:Anticipatory_scheduling|anticipatory]] IO スケジューラはこの問題を解決ます。このスケジューラ他のリクエストを処理す前に、近く別の読み取り操作が発生することを予測して、数ミリ秒待機します。


上述のスケジューラはどちらも全体のスループットを改善することを目指していましたが、それによって不幸にも長い間待たされてしまうリクエストも発生していました。例えば、プロセスの多くがストレージ領域の最初の部分をリクエストしていて、不幸なプロセスはストレージの末端付近をリクエストしているような状況を考えて下さい。そのため、開発者は公平なアルゴリズムを作成することを決めて [[w:Deadline_scheduler|deadline]] スケジューラが追加されました。deadline スケジューラはアドレスによってキューの順番を決めますが (エレベーターと同じ)、一定期間、リクエストがキューの中で待機した場合、リクエストを (経過時間によって順番が付けられる) "expired" キューに移動します。スケジューラは先に expired キューをチェックして、リクエストを処理してからエレベーターキューに移動します。このアルゴリズムは公平性のために全体のスループットを犠牲にしているわけです。
上述のスケジューラはどちらも全体のスループットを改善することを目指していましたが、それによって不幸にも長い間待たされてしまうリクエストも発生していました。例えば、プロセスの多くがストレージ領域の最初の部分をリクエストしていて、不幸なプロセスはストレージの末端付近をリクエストしているような状況を考えて下さい。そのため、開発者は公平なアルゴリズムを作成することを決めて [[w:Deadline_scheduler|deadline]] スケジューラが追加されました。deadline スケジューラはアドレスによってキューの順番を決めますが (エレベーターアルゴリズムと同じ)、一定期間、リクエストがキューの中で待機した場合、リクエストを (経過時間によって順番が付けられる) "expired" キューに移動します。スケジューラは先に expired キューをチェックして、リクエストを処理してからエレベーターキューに移動します。このアルゴリズムは公平性のために全体のスループットを犠牲にしているわけです。


[[w:CFQ|Completely Fair Queuing ''(CFQ)'']] は別のアプローチで問題に取り組みました。CFQ はプロセスの優先度に基づくキューを使ってタイムスライスと許容するリクエストの数を割り当てます。さらに [[cgroups]] のサポートを追加することで特定のプロセスグループに一定の IO を予約できるようにしました。これは共有・クラウドサーバーで特に役立ちます。ユーザーはリソースが必要なときに料金を払って IOPS を得られるのです。また、同期 I/O で近くの操作を待機するという ''anticipatory'' スケジューラの機能を改良して取り入れています。より高度な CFQ スケジューラが導入されたことで ''anticipatory'' と ''elevator'' スケジューラは Linux カーネルから外されることになりました。
[[w:CFQ|Completely Fair Queuing (CFQ)]] は別のアプローチで問題に取り組みました。CFQ はプロセスの優先度に基づくキューを使ってタイムスライスと許容するリクエストの数を割り当てます。さらに [[cgroups]] のサポートを追加することで特定のプロセスグループに一定の IO を予約できるようにしました。これは共有・クラウドサーバーで特に役立ちます。ユーザーはリソースが必要なときに料金を払って IOPS を得られるのです。また、同期 I/O で近くの操作を待機するという ''anticipatory'' スケジューラの機能を改良して取り入れています。''anticipatory'' と ''elevator'' スケジューラは Linux カーネルから外され、下記のよ高度な代替スケジューラに置き換えられました。


[https://algo.ing.unimo.it/people/paolo/disk_sched/ Budget Fair Queuing ''(BFQ)''] は CFQ のコードをベースにいくつか改善を加えています。各プロセスに固定長のタイムスライスを与えるかわりに、プロセスのセクタ数から計算した "budget" を割り当ててヒューリスティックを用います。BFQ は想定的に複雑なスケジューラであるため、オーバーヘッドが大きく、回転ドライブや低速 SSD に適しています。特に遅い CPU と組み合わせたときに高速なデバイスの足を引っ張ってしまうような場合に有用です。BFQ は個人用のシステムでインタラクティブな作業を行うときに、ストレージデバイスがまるで待機状態のときのように素早く反応することを目標としています。デフォルト設定ではスループットの最大化よりもレイテンシの最小化が優先されているのが特徴です。
[https://docs.kernel.org/block/bfq-iosched.html Budget Fair Queuing (BFQ)] は CFQ のコードをベースにいくつか改善を加えています。各プロセスに固定長のタイムスライスを与えるかわりに、プロセスのセクタ数から計算した "budget" を割り当ててヒューリスティックを用います。BFQ は想定的に複雑なスケジューラであるため、オーバーヘッドが大きく、回転ドライブや低速 SSD に適しています。特に遅い CPU と組み合わせたときに高速なデバイスの足を引っ張ってしまうような場合に有用です。BFQ は個人用のシステムでインタラクティブな作業を行うときに、ストレージデバイスがまるで待機状態のときのように素早く反応することを目標としています。デフォルト設定ではスループットの最大化よりもレイテンシの最小化が優先されているのが特徴です。これにより、ハードドライブにおいて[https://www.phoronix.com/review/linux-50hdd-io/2 アプリケーションの起動を劇的に加速化]させられる場合があります。


[https://lwn.net/Articles/720675/ Kyber] はネットワークルーティングで用いられている積極的なキュー管理テクニックから生まれた新しいスケジューラです。リクエストを制限するメカニズムとして「トークン」を基に実装されています。 リクエストの割当を受けるにはキューイングトークンを必要とすることで、リクエストのスタベーションを防ぎます。ディスパッチトークンによってデバイスの特定の優先度の操作に制限されます。さらに、ターゲットの読み込みレイテンシを定義して、レイテンシ目標を達成するためにスケジューラ自身がチューニングを行います。アルゴリズムの実装は比較的シンプルなので高速なデバイスでも効率的に機能します。
[https://lwn.net/Articles/720675/ Kyber] はネットワークルーティングで用いられている積極的なキュー管理テクニックから生まれた新しいスケジューラです。リクエストを制限するメカニズムとして「トークン」を基に実装されています。 リクエストの割当を受けるにはキューイングトークンを必要とすることで、リクエストのスタベーションを防ぎます。ディスパッチトークンによってデバイスの特定の優先度の操作に制限されます。さらに、ターゲットの読み込みレイテンシを定義して、レイテンシ目標を達成するためにスケジューラ自身がチューニングを行います。アルゴリズムの実装は比較的シンプルなので高速なデバイスでも効率的に機能します。


==== カーネルの I/O スケジューラ ====
==== カーネルの I/O スケジューラ ====
初期のアルゴリズムには既にメインラインから外されているものもあります。公式 Linux カーネルがサポートしている I/O スケジューラは以下の2つのカテゴリに分けることができます:


初期のアルゴリズムには既にメインラインから外されているものもあります。公式の Linux カーネルはいくつかの I/O スケジューラをサポートしています。[https://www.thomas-krenn.com/en/wiki/Linux_Multi-Queue_Block_IO_Queueing_Mechanism_(blk-mq) Multi-Queue Block I/O Queuing Mechanism (blk-mq)] は I/O クエリを複数のキューに割り当てて、複数のスレッドおよび CPU コアにタスクを分散させます。このフレームワークでは以下のスケジューラが使えます:
*'''シングルキュースケジューラ'''はデフォルトで使えるスケジューラです:

**[[w:NOOP_scheduler|NOOP]] は最も単純なスケジューラです。全ての I/O リクエストをシンプルな FIFO キューに入れてリクエストをまとめます。NOOP アルゴリズムでは、セクタ番号によってリクエストの順番を変えることがありません。したがって、デバイスレベルで順位付けを行っている場合や SSD など順位付けが意味をなさない場合は NOOP を使用します。
*''None''、キューイングアルゴリズムは適用されません。
**''Deadline''
*''mq-deadline'' は deadline スケジューラ (下記を参照) をマルチスレッドに対応させたスケジューラです。
**''CFQ''
*''Kyber''
*'''マルチキュースケジューラ'''は [[#I/O スケジューラの変更]]で説明しているように起動時にモードを有効にして使うことができます。[https://www.thomas-krenn.com/en/wiki/Linux_Multi-Queue_Block_IO_Queueing_Mechanism_(blk-mq) Multi-Queue Block I/O Queuing Mechanism ''(blk-mq)''] は I/O クエリを複数のキューに割り当てて、複数のスレッドおよび CPU コアにタスクを分散させます。blk-mq では以下のスケジューラが使えます:
*''BFQ''
**''None'', キューイングアルゴリズムは適用されません。
**''mq-deadline'' は deadline スケジューラをマルチスレッドに対応させたスケジューラです。
**''Kyber''
**''BFQ''
:{{Note|1=シングルキュースケジューラは [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=f382fb0bcef4c37dc049e9f6963e3baf204d815c Linux5.0 以降カーネルから削除されました]}}


==== I/O スケジューラの変更 ====
==== I/O スケジューラの変更 ====

{{Note|
* スケジューラーの最適な選択は、デバイスとワークロードの正確な性質の両方によって異なります。 また、MB/秒単位のスループットだけがパフォーマンスの指標ではありません。デッドラインや公平性は全体的なスループットを低下させますが、システムの応答性を向上させる可能性があります。 [[ベンチマーク]] は、各 I/O スケジューラのパフォーマンスを示すのに役立つ場合があります。
{{Note|スケジューラーの最適な選択は、デバイスとワークロードの正確な性質の両方によって異なります。 また、MB/秒単位のスループットだけがパフォーマンスの指標ではありません。デッドラインや公平性は全体的なスループットを低下させますが、システムの応答性を向上させる可能性があります。 [[ベンチマーク]] は、各 I/O スケジューラのパフォーマンスを示すのに役立つ場合があります。}}

}}
特定のデバイスで利用できるスケジューラと、現在使われているスケジューラを確認するには:
特定のデバイスで利用可能なスケジューラとアクティブなスケジューラを表示するには (アクティブなスケジューラは角括弧の中):

{{hc|$ cat /sys/block/'''''sda'''''/queue/scheduler|
{{hc|$ cat /sys/block/'''''sda'''''/queue/scheduler|
mq-deadline kyber [bfq] none}}
あるいは全てのデバイスでスケジューラを確認するには:
{{hc|$ cat /sys/block/'''sd*'''/queue/scheduler|
mq-deadline kyber [bfq] none
mq-deadline kyber [bfq] none
}}
[mq-deadline] kyber bfq none
mq-deadline kyber [bfq] none}}


''sda'' デバイスで I/O スケジューラを ''bfq'' に変更するには、以下のコマンドを使用します:
デバイスで利用可能なスケジューラを表示するには:

{{hc|$ grep "" /sys/block/'''*'''/queue/scheduler|
/sys/block/pktcdvd0/queue/scheduler:none
/sys/block/sda/queue/scheduler:mq-deadline kyber [bfq] none
/sys/block/sr0/queue/scheduler:[mq-deadline] kyber bfq none
}}

デバイス ''sda'' のアクティブな I/O スケジューラを ''bfq'' に変更するには:


# echo '''''bfq''''' > /sys/block/'''''sda'''''/queue/scheduler
# echo '''''bfq''''' > /sys/block/'''''sda'''''/queue/scheduler


I/O スケジューラの変更プロセスは、ディスクが回転式か否かに応じて自動化することができ、起動毎に永続化させることができます。例えば、以下の [[udev]] ルールは、回転ドライブに対しては ''bfq'' を、[[SSD]]/eMMC ドライブに対しては ''bfq'' を、[[NVMe]] に対しては ''none'' を設定します:
[[SSD]] や [[NVMe]] の場合多数の IOPS を処理できるため、''none'' や ''mq-deadline'' などのシンプルなアルゴリズムが最適です。逆に HDD には ''BFQ'' が適しています。以下のように [[udev]] ルールを使うことで、ディスクが HDD か SSD かどうかで I/O スケジューラを自動的に変更して永続的に設定することが可能です:


{{hc|/etc/udev/rules.d/60-ioschedulers.rules|2=
{{hc|/etc/udev/rules.d/60-ioschedulers.rules|<nowiki>
# HDD
# set scheduler for NVMe
ACTION=="add{{!}}change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
# set scheduler for SSD and eMMC
ACTION=="add{{!}}change", KERNEL=="sd[a-z]{{!}}mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# set scheduler for rotating disks
ACTION=="add{{!}}change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
}}


# SSD
ルールを保存したら、マシンを再起動するか、ルールを[[Udev#新しいルールをロードする|リロード]]してください。
ACTION=="add|change", KERNEL=="sd[a-z]*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="bfq"

# NVMe SSD
ACTION=="add|change", KERNEL=="nvme[0-9]*", ENV{DEVTYPE}=="disk", ATTR{queue/scheduler}="none"
</nowiki>}}

再起動するか、強制的に[[udev#新しいルールをロードする|新しいルールをロード]]してください。


==== IO スケジューラの調整 ====
==== IO スケジューラの調整 ====


カーネルの I/O スケジューラには遅延・期限時間や FIFO パラメータなどそれぞれ設定項目が存在します。特定のデバイスとワークロードの組み合わせにあわせてアルゴリズムを調整することが可能です。スループットを高めたり遅延を少なくしたりするときに用います。設定項目と説明は [https://www.kernel.org/doc/Documentation/block/ カーネルドキュメントファイル] で確認できます。
カーネルの I/O スケジューラには遅延・期限時間や FIFO パラメータなどそれぞれ設定項目が存在します。特定のデバイスとワークロードの組み合わせにあわせてアルゴリズムを調整することが可能です。スループットを高めたり遅延を少なくしたりするときに用います。
設定項目と説明は [https://docs.kernel.org/block/index.html カーネルドキュメント] で確認できます。


特定のデバイスで設定可能なパラメータを確認するには (以下の例では ''sdb'' は ''deadline'' を使用しています):
特定のデバイスで設定可能なパラメータを確認するには (以下の例では ''sdb'' は ''deadline'' を使用しています):

{{hc|$ ls /sys/block/'''''sdb'''''/queue/iosched|
{{hc|$ ls /sys/block/'''''sdb'''''/queue/iosched|
fifo_batch front_merges read_expire write_expire writes_starved}}
fifo_batch front_merges read_expire write_expire writes_starved}}
167行目: 173行目:
=== 電源管理設定とライトキャッシュ ===
=== 電源管理設定とライトキャッシュ ===


従来の回転ディスク (HDD) を使用する場合、省電力機能を完全に無効するか下げ、書き込みキャッシュが有効化されていることを確認すると良いかもしれません。
従来の回転ディスク (HDD) を使用する場合、省電力機能を完全に無効するか下げるかし、書き込みキャッシュが有効になっているかどうかを確認すると良いかもしれません。


[[Hdparm#電源管理の設定]] と [[Hdparm#ライトキャッシュ]] を参照してください。
[[Hdparm#電源管理の設定]] と [[Hdparm#ライトキャッシュ]] を参照してください。


後で、起動時にこれらを適用する [[Hdparm#udev ルールによる永続的な設定|udev ルール]]を作成することができます。
後で、起動時にこれらを適用する [[Hdparm#udev ルールによる永続的な設定|udev ルール]] を作成することができます。


{{Tip|[[GNOME]] では、ディスクアプリケーションからこれらのパラメータのいくつかを設定でき、udev ルールは必要ありません。}}
{{Tip|[[GNOME]] では、"ディスク" アプリケーションからこれらのパラメータのいくつかを設定でき、udev ルールは必要ありません。}}


{{Note|一部の機能はあなたのハードドライブではサポートされていないかもしれません。その場合、Hdparm が通知します。なので、この特定の機能の設定を無視してください。}}
{{Note|一部の機能はあなたのハードドライブではサポートされていないかもしれません。その場合、Hdparm が通知します。なので、この特定の機能の設定を無視してください。}}
181行目: 187行目:
遅いストレージデバイスへの不必要なアクセスを避けることはパフォーマンスを向上にとって良いことであり、デバイスの寿命を伸ばすことにも繋がります。ただし最近のハードウェアでは寿命への影響はわずかです。
遅いストレージデバイスへの不必要なアクセスを避けることはパフォーマンスを向上にとって良いことであり、デバイスの寿命を伸ばすことにも繋がります。ただし最近のハードウェアでは寿命への影響はわずかです。


{{Note|書き込み増幅率が平凡な 10x で、書き込み/消去サイクルが標準的な 10000 である、32GB の SSD の場合、毎日 10GB のデータ書き込みを行うと、8年間で寿命が尽きるとされます。この数字はもっと容量が大きい SSD を使ったり書き込み増幅が少ない最新のコントローラを使うことで改善されます。また、ディスクの書き込みを制限するのにどの方法が必要なのか考えるときは [https://techreport.com/review/25889/the-ssd-endurance-experiment-500tb-update] を比較してください。}}
{{Note|書き込み増幅率が平凡な 10x で、書き込み/消去サイクルが標準的な 10000 である、32GB の SSD の場合、'''毎日 10GB のデータ書き込みを行うと''''''8年間で寿命が尽きる'''とされます。この数字はもっと[https://kcall.co.uk/ssd/ 容量が大きい SSD] を使ったり書き込み増幅が少ない最新のコントローラを使うことで改善されます。また、ディスクの書き込みを制限するのにどの方法が必要なのか考えるときは[https://web.archive.org/web/20161124030749/http://techreport.com/review/27909/the-ssd-endurance-experiment-theyre-all-dead この耐久実験]も参照してください。}}


==== ディスクの書き込みを表示する ====
==== ディスクの書き込みを表示する ====
189行目: 195行目:
==== ファイルを tmpfs に再配置する ====
==== ファイルを tmpfs に再配置する ====


ブラウザプロファイルなどのファイルを {{ic|/tmp}} や {{ic|/dev/shm}} などの [[tmpfs]] ファイルシステムに再配置してメモリ内に保存することで、アプリケーションのレスポンスを向上させることができます:
ブラウザプロファイルなどのファイルを [[tmpfs]] ファイルシステムに再配置してメモリ内に保存することで、アプリケーションのレスポンスを向上させることができます:


* ブラウザプロファイル同期については [[Profile-sync-daemon]] を参照してください。Firefox を使っている場合 [[Firefox Ramdisk]] 参照。
* ブラウザプロファイル同期させる方法については [[Profile-sync-daemon]] を参照してください。特定のブラウザには注意が必要な場合があります。例えば [[Firefox Ramdisk]] 参照してください
* 特定のフォルダを同期る方法は [[Anything-sync-daemon]] を参照してください。
* 任意指定されたフォルダを同期させる方法については [[Anything-sync-daemon]] を参照してください。
* tmpfs 内でパッケージをビルドすることでコンパイル時間を減らす方法については [[Makepkg#ビルド時間を短縮する]] を参照してください。


==== tmpfs でコンパイルする ====
==== ファイルシステム ====


対応する[[ファイルシステム]]ページを参照して、パフォーマンス改善に関する指示があるか見てください。[[#ファイルシステムの選択とチューニング]] に挙げられているファイルシステムのリストも参照してください。
パッケージのビルド時にコンパイル時間を短縮する方法は [[Makepkg#コンパイル時間を短縮する]]を参照。


==== ファイルシテムの最適化 ====
==== スワップ領域 ====


詳細は [[スワップ#パフォーマンス]] を見てください。
[[ファイルシステム]]によってはパフォーマンスを改善する方法が存在することがあります。例: [[Ext4#ヒントとテクニック]]。


==== スワプ領域 ====
==== ライトバクの間隔とバッファサイズ ====

詳細は [[Sysctl#仮想メモリ]] を見てください。

==== コアダンプを無効化する ====


[[スワップ#パフォーマスチューニング]]を見てください。
[[コアダンプ#自動的なコアダプの無効化]] を見てください。


=== ionice によるストレージ I/O スケジューリング ===
=== ionice によるストレージ I/O スケジューリング ===


バックアップなどの作業ではストレージ I/O の遅延はさほど関係なく I/O 帯域幅を最大限使う意味がありません。そのような作業はバックグラウンドタスク分類することができます。一方デスクトップは UI のレスポンス早くするために高速な I/O を必要とします。バックグラウンドタスクとしストレージ帯域幅を減らすことで、他のトレージ I/O を必要タスクが帯域幅活用すことが可能です。Linux I/O スケジューラである CFQは、プロセスによって優先度を別々に設定できます。
バックアップなど多くタスクにおいて、そのタスクを実行するために、ストレージ I/O の遅延が短かったり、ストレージ I/O 帯域が大きかったりする必要はありません。そのようなタスクはバックグラウンドタスク分類することができます。一方デスクトップにおいて高速な I/O は UI の応答性る上で必須です。ゆえ、他のタスクがストレージ I/O を必要としている間は、バックグラウンドタスクによっ利用できるストレージ帯域幅を減らすことが有益す。これはプロセに異な優先度設定でき Linux I/O スケジューラ BFQ を使用すること実現できます。


バックグラウンドプロセスの I/O 優先度 "Idle" レベルまで減らしてからプロセスを起動るには:
以下のようにバックグラウンドプロセスを実行することで、プロセスの I/O 優先度 "Idle" レベルまで落とすことができます:


# ionice -c 3 command
$ ionice -c 3 ''command''


しく {{man|1|ionice}} や [https://www.cyberciti.biz/tips/linux-set-io-scheduling-class-priority.html] をてください。
は [https://www.cyberciti.biz/tips/linux-set-io-scheduling-class-priority.html a short introduction to ionice] や {{man|1|ionice}}参照してください。

=== トリム ===

最適なパフォーマンスを得るには、SSD の空きブロックを定期的に discard (トリム) してランダム書き込みの速度を最適化するべきです。詳細は [[ソリッドステートドライブ#TRIM]] を参照してください。

== ネットワーク ==

=== 一般情報 ===

* カーネルネットワーキング: [[Sysctl#パフォーマンスを向上させる]] を参照
* NIC: [[ネットワーク設定#MTU とキューの長さの設定]] を参照
* DNS: キャッシュ付きの DNS リゾルバの使用を検討してください。[[ドメイン名前解決#DNS サーバ]] を参照
* Samba: [[Samba#スループットを向上させる]] を参照

=== 規制範囲 ===

無線ネットワークサービスには国毎に異なる標準があります。たいてい、ネットワーク構成に応じて正しい範囲を設定すれば、シグナルをより強くできます。これはセットアップ時に設定することが一般的ですが、[https://community.frame.work/t/responded-amd-rz616-wifi-card-doesnt-work-with-6ghz-on-kernel-6-7/43226 設定が正しく適用されない]場合もあります。{{ic|/sys/module/cfg80211/parameters/ieee80211_regdom}} の内容を確認してください; 値が {{ic|00}} (グローバルな設定であることを示し、通常、制限がより強くなります) である場合や、間違った範囲に設定されている場合、以下の[[カーネルパラメータ]]を追加してみてください。ただし、{{ic|''XX''}} は正しい国コード (例: 日本の場合は {{ic|JP}} です):

cfg80211.ieee80211_regdom=''XX''

その後、一旦再起動してください。

=== 電源管理 ===

特定のデバイスには、使用中であるにもかかわらずネットワークアダプタが誤って省電力モードに入り、パフォーマンスが低下したり接続が切断されたりする問題があります。そのような場合、パッケージを[[アップグレード]]し、必要なファームウェアアップデートを受けられるようにしてください。そして、[[電源管理#ネットワークインターフェイス]] を見てください。


== CPU ==
== CPU ==
222行目: 258行目:
[[Wikipedia:ja:オーバークロック|オーバークロック]]は、CPU クロック周波数の上限を上げることにより、CPU の計算パフォーマンスを向上させます。オーバークロックできるかどうかは、CPU モデルとマザーボードモデルの組み合わせに依存します。オーバークロックは BIOS を介して行うのが最も一般的です。オーバークロックには欠点とリスクもあります。ここでは推奨も非推奨もしないでおきましょう。
[[Wikipedia:ja:オーバークロック|オーバークロック]]は、CPU クロック周波数の上限を上げることにより、CPU の計算パフォーマンスを向上させます。オーバークロックできるかどうかは、CPU モデルとマザーボードモデルの組み合わせに依存します。オーバークロックは BIOS を介して行うのが最も一般的です。オーバークロックには欠点とリスクもあります。ここでは推奨も非推奨もしないでおきましょう。


Intel 製のチップの多くは acpi_cpufreq などや他のほとんどのユーティリティに正しいクロック周波数を伝えません。この結果、[[dmesg]] は極端なメッセージを表示します (これは、{{ic|acpi_cpufreq}} カーネルモジュールをアンロードしてブラックリスト化することで回避可能です)。クロック速度を読むには、{{Pkg|i7z}} パッケージの ''i7z'' を使用してください。オーバークロックされた CPU が正しく動作していることを確認する方法として、[[ストレステスト]]が推奨されます。
Intel 製のチップの多くは acpi_cpufreq などや他のほとんどのユーティリティに正しいクロック周波数を伝えません。この結果、[[dmesg]] は極端なメッセージを表示します (これは、{{ic|acpi_cpufreq}} カーネルモジュールをアンロードしてブラックリスト化することで回避可能です)。クロック速度を読むには、{{AUR|i7z}} パッケージの ''i7z'' を使用してください。オーバークロックされた CPU が正しく動作していることを確認する方法として、[[ストレステスト]]が推奨されます。


=== 周波数スケーリング ===
=== 周波数スケーリング ===
228行目: 264行目:
[[CPU 周波数スケーリング]]を見てください。
[[CPU 周波数スケーリング]]を見てください。


=== レスポンスのためにデフォルトのスケジューラ (CFS) を調整する ===
=== CPU スケジューラ ===


メインライン Linux カーネルのデフォルトの CPU スケジューラは [[Wikipedia:ja:Completely Fair Scheduler|CFS]] です。
メインライン Linux カーネルのデフォルトの CPU スケジューラは [https://lwn.net/Articles/925371/ EEVDF] です。


上流のデフォルト設定は、高いスループットを出すように調整されており、それにより CPU 高負荷時にデスクトップアプリケーションが応答しなくなってしまいます。

{{AUR|cfs-zen-tweaks}} パッケージには、{{Pkg|linux-zen}} カーネルと同じ設定を使用するように CFS を設定するスクリプトが含まれています。スタートアップ時にこのスクリプトを実行するには、{{ic|set-cfs-tweaks.service}} を[[起動/有効化]]してください。

=== 代替の CPU スケジューラ ===

* {{App|[[Wikipedia:Brain_Fuck_Scheduler#MuQSS|MuQSS]]|Multiple Queue Skiplist Scheduler。[[Wikipedia:Con_Kolivas|Con Kolivas]] によって開発されている {{ic|-ck}} パッチセットにより利用可能。|[[非公式ユーザーリポジトリ/Repo-ck]]|{{AUR|linux-ck}}}}
* {{App|[https://cchalpha.blogspot.com/search/label/PDS PDS]|デスクトップのレスポンスに焦点を当てている、優先度 (Priority) とデッドライン (Deadline) をベースとした Skiplist 複数キュースケジューラ。|https://cchalpha.blogspot.com/|{{AUR|linux-pds}}}}
* {{App|[https://cchalpha.blogspot.com/search/label/BMQ BMQ]|BMQ "BitMap Queue" スケジューラは、既存の PDS 開発経験を元に作成され、Google の Zircon (Fuchsia OS イニシアチブ内のカーネル) に使用されているスケジューラからインスパイアされました。CachyOS からのパッチセットにより利用可能。|https://cchalpha.blogspot.com/|{{AUR|linux-cachyos-bmq}}}}
* {{App|[https://cchalpha.blogspot.com/2020/05/project-c-announcement.html Project C]|BMQ を Project C にリファクタリングするためのクロスプロジェクト。Project C コードベースに基づいて PSD を再作成します。よって、これは2つのプロジェクトのマージであり、その後 PDS が Project C として更新されます。より最近の開発として推奨されます。|https://cchalpha.blogspot.com/|{{AUR|linux-prjc}}}}
* {{App|[https://cchalpha.blogspot.com/2020/05/project-c-announcement.html Project C]|BMQ を Project C にリファクタリングするためのクロスプロジェクト。Project C コードベースに基づいて PSD を再作成します。よって、これは2つのプロジェクトのマージであり、その後 PDS が Project C として更新されます。より最近の開発として推奨されます。|https://cchalpha.blogspot.com/|{{AUR|linux-prjc}}}}
* {{App|BORE|BORE スケジューラは、対話型タスクにおいてある程度の公平性を犠牲にして低レイテンシを実現することに焦点を当てています。CFS の上に構築されており、vruntime コード更新だけに調整されています。なので、他の非公式 CPU スケジューラと比較して、全体的な変更は非常に小さいです。|https://github.com/firelzrd/bore-scheduler|{{AUR|linux-cachyos-bore}}}}
* {{App|[https://github.com/hamadmarri/cacule-cpu-scheduler CacULE]|CacULE CPU スケジューラは、interactivity score メカニズムに基づく CFS パッチセットです。Interactivity score は ULE スケジューラ (FreeBSD スケジューラ) にインスパイアされました。このパッチの目標は、システムのレスポンス/レイテンシを強化することです。|https://github.com/hamadmarri/cacule-cpu-scheduler/|{{AUR|linux-cacule}}}}
* {{App|[https://github.com/hamadmarri/TT-CPU-Scheduler TT]|Task Type (TT) スケジューラの目標は、基づいてタスクの種類を検出し、その種類に基づいてスケジュリングを制御すことです。|https://github.com/hamadmarri/TT-CPU-Scheduler|{{AUR|linux-tt}}}}
* {{App|SCX|システムをリセットせずに様々な CPU スケジューラドできようにします。|https://github.com/sched-ext/scx|{{Pkg|scx-scheds}}}}
* {{App|[https://github.com/firelzrd/bore-scheduler BORE]|BORE スケジューラは、対話型タスクにおいてある程度の公平性を犠牲にして低レイテンシを実現することに焦点を当てています。CFS の上に構築されており、vruntime コード更新だけに調整されています。なので、他の非公式 CPU スケジューラと比較して、全体的な変更は非常に小さいです。|https://github.com/firelzrd/bore-scheduler|{{AUR|linux-cachyos-bore}}}}


=== リアルタイムカーネル ===
=== リアルタイムカーネル ===
256行目: 282行目:
==== Ananicy ====
==== Ananicy ====


[https://github.com/Nefelim4ag/Ananicy Ananicy] は動的に実行可能ファイルの nice レベルを調整するためのデーモンで、{{AUR|ananicy-git}} や {{AUR|ananicy-cpp}} パッケージで利用可能です。nice レベルとは、CPU 資源を配分するときの実行可能ファイルの優先度を表すものです。
[https://gitlab.com/ananicy-cpp/ananicy-cpp Ananicy CPP] は動的に実行可能ファイルの nice レベルを調整するためのデーモンで、{{Pkg|ananicy-cpp}} や {{AUR|ananicy-cpp-git}} パッケージで利用可能です。nice レベルとは、CPU リソースを配分するときの実行可能ファイルの優先度を表すものです。

{{Warning|1=[[Gamemode]] と [https://gitlab.com/ananicy-cpp/ananicy-cpp Ananicy CPP] はどちらもプロセスの nice レベルを調整しようとします。これらのツールを組み合わせて使用することは推奨されていません。[https://github.com/CachyOS/ananicy-rules/blob/master/README.md#gamemode--ananicy-cpp--bad-idea]}}


==== cgroups ====
==== cgroups ====
262行目: 290行目:
[[cgroups]] を見てください。
[[cgroups]] を見てください。


==== Cpulimit ====
==== LimitCPU ====


[https://github.com/opsengine/cpulimit Cpulimit] は特定のプロセスの CPU 使用率を制限するプログラムです。{{Pkg|cpulimit}} をインストールすれば、プロセスの PID で CPU 使用率を 0 から 100 までの値にコンピュータに搭載されている CPU コア数をかけた数字の範囲で制限することができます。例えば、CPU コアが8個であれば利用可能な値は 0 から 800 です。使用例:
[https://limitcpu.sourceforge.net/ LimitCPU] は特定のプロセスの CPU 使用率を制限するプログラムです。{{AUR|limitcpu}} をインストールすれば、プロセスの PID で CPU 使用率を 0 から 100 までの値にコンピュータに搭載されている CPU コア数をかけた数字の範囲で制限することができます。例えば、CPU コアが8個であれば利用可能な値は 0 から 800 です。使用例:


$ cpulimit -l 50 -p 5081
$ limitcpu -l 50 -p 5081


=== irqbalance ===
=== irqbalance ===
272行目: 300行目:
{{Pkg|irqbalance}} はマルチプロセッサシステムでパフォーマンスを向上させるためにプロセッサ間でハードウェア割り込みを分散させます。{{ic|irqbalance.service}} で[[systemd#ユニットを使う|操作]]することが可能です。
{{Pkg|irqbalance}} はマルチプロセッサシステムでパフォーマンスを向上させるためにプロセッサ間でハードウェア割り込みを分散させます。{{ic|irqbalance.service}} で[[systemd#ユニットを使う|操作]]することが可能です。


{{Warning|1=一部のケースでは、irqbalance が省電力機能に干渉し、ビデオゲームでのスタッタリングやフレームレート低下を引き起こす可能性があります。[https://bugs.launchpad.net/ubuntu/+source/ubuntu-meta/+bug/1833322/comments/4]}}
=== CPU の脆弱性の緩和をオフにする ===


=== CPU の脆弱性の緩和策をオフにする ===
{{Warning|1=以下の設定を使うときは問題の脆弱性について確認してください。詳しくは [https://phoronix.com/scan.php?page=news_item&px=Linux-Improve-CPU-Spec-Switches こちら] や [https://linuxreviews.org/HOWTO_make_Linux_run_blazing_fast_(again)_on_Intel_CPUs こちら] のページを参照。}}

{{Warning|1=以下の設定を使うときは問題の脆弱性について確認してください。特に、緩和策が無効化されている場合、'''信頼できないプログラムを隔離する方法として仮想マシンを使ってはなりません'''。詳しくは [https://phoronix.com/scan.php?page=news_item&px=Linux-Improve-CPU-Spec-Switches こちら] や [https://linuxreviews.org/HOWTO_make_Linux_run_blazing_fast_(again)_on_Intel_CPUs こちら] のページを参照。}}


CPU の脆弱性の緩和策をオフにすることで、パフォーマンスが向上する場合があります。以下の[[カーネルパラメータ]]ですべての緩和策が無効になります:
CPU の脆弱性の緩和策をオフにすることで、パフォーマンスが向上する場合があります。以下の[[カーネルパラメータ]]ですべての緩和策が無効になります:
282行目: 312行目:
このパラメータによって切り替えられるすべてのスイッチについての説明は、[https://docs.kernel.org/admin-guide/kernel-parameters.html kernel.org] で見られます。{{AUR|spectre-meltdown-checker}} や {{man|1|lscpu}} ({{Pkg|util-linux}} に同梱) を使うことで、脆弱性チェックを行うことができます。
このパラメータによって切り替えられるすべてのスイッチについての説明は、[https://docs.kernel.org/admin-guide/kernel-parameters.html kernel.org] で見られます。{{AUR|spectre-meltdown-checker}} や {{man|1|lscpu}} ({{Pkg|util-linux}} に同梱) を使うことで、脆弱性チェックを行うことができます。


{{Note|1=第10世代およびそれ以降の Intel CPU、または AMD Ryzen 1 およびそれ以降の CPU を使用している場合、緩和策を無効化することにより得られるパフォーマンスの向上は、最大でも 5% にとどまります。一方、それ以前の世代の CPU では、最大 25% まで向上します。[https://www.phoronix.com/scan.php?page=article&item=3-years-specmelt 2021 初頭における総評]、[https://www.phoronix.com/scan.php?page=article&item=spectre-rocket-lake Rocket Lake におけるテスト]、[https://www.phoronix.com/scan.php?page=article&item=alder-lake-mitigations Alder Lake におけるテスト] を参照。}}
{{Note|1=第10世代およびそれ以降の Intel CPU、または AMD Ryzen シリーズ 1000 およびそれ以降の CPU を使用している場合、緩和策を無効化することにより得られるパフォーマンスの向上は、最大でも 5% にとどまります。一方、それ以前の世代の CPU では、最大 25% まで向上します。[https://www.phoronix.com/scan.php?page=article&item=3-years-specmelt 2021 初頭における総評]、[https://www.phoronix.com/scan.php?page=article&item=spectre-rocket-lake Rocket Lake におけるテスト]、[https://www.phoronix.com/scan.php?page=article&item=alder-lake-mitigations Alder Lake におけるテスト] を参照。}}

=== CPU に合わせてコンパイルをチューニングする ===

CPU によっては、ソフトウェアのコンパイル時に {{ic|1=-march=native}} フラグを使って、搭載されている CPU の[[Wikipedia:ja:マイクロアーキテクチャ|マイクロアーキテクチャ]]に合わせてソフトウェアのコンパイルをチューニングすると、パフォーマンスを少し向上できる場合があります。ただし、このフラグを使ってコンパイルしたバイナリは、他の CPU マイクロアーキテクチャ上では遅くなってしまうか、正しく動作しません。このオプションを使用していて、なおかつ CPU を変更あるいはアップグレードしたい場合は、バイナリを再コンパイルするか、新しい CPU には今の CPU と同じマイクロアーキテクチャのものを選ぶ必要があります。[[Makepkg#最適化|このオプションは makepkg でデフォルトとして設定することもできます]]。

[[カーネル#コンパイル|カーネルを自身でコンパイルする]]場合は、{{ic|CONFIG_X86_NATIVE_CPU}} オプションでカーネルのコンパイル中にこのフラグを有効化できます。しかし、通常のバイナリでパフォーマンス向上の寄与度が大きい拡張ベクトル命令を Linux カーネルは汎用のコード内で[https://github.com/torvalds/linux/blob/e5f0a698b34ed76002dc5cff3804a61c80233a7a/arch/x86/Makefile#L77 禁じている]ため、カーネルのパフォーマンス向上はより小さいでしょう。そのため、カーネルのパフォーマンス向上のほとんどは、[https://github.com/gcc-mirror/gcc/blob/ffa98429b93934be87f58bc3af481a69310aedaf/gcc/config/i386/x86-tune-costs.h より小さなマイクロ最適化]によるものになります。


== グラフィック ==
== グラフィック ==
288行目: 324行目:
=== Xorg の設定 ===
=== Xorg の設定 ===


グラフィックパフォーマンスは {{man|5|xorg.conf}} の設定に依存している場合があります。[[NVIDIA]]、[[ATI]]、[[AMDGPU]]、[[Intel]] の記事を参照してください。不適切な設定は Xorg が動作しなくなる原因になるため、注意しましょう。
グラフィックパフォーマンスは {{man|5|xorg.conf}} の設定に依存している場合があります。[[NVIDIA]]、[[AMDGPU]]、[[Intel]] の記事を参照してください。不適切な設定は Xorg が動作しなくなる原因になるため、注意しましょう。


=== Mesa の設定 ===
=== Mesa の設定 ===


Mesa ドライバのパフォーマンスは [https://dri.freedesktop.org/wiki/ConfigurationInfrastructure/ drirc] で設定できます。GUI の設定ツールもありま:
Mesa ドライバのパフォーマンスは [https://dri.freedesktop.org/wiki/ConfigurationInfrastructure/ drirc] で設定できます。{{Pkg|adriconf}} (Advanced DRI Configurator) はオプションを設定して標準 drirc ファイルに書き込むことで MESA ドライバを設定する GUI ツール

* {{App|adriconf (Advanced DRI Configurator)|オプションを設定して標準の drirc ファイルに書き込むことで MESA ドライバを設定する GUI ツール。|https://gitlab.freedesktop.org/mesa/adriconf/|{{Pkg|adriconf}}}}
* {{App|DRIconf|Direct Rendering Infrastructure の設定アプレット。OpenGL ドライバのパフォーマンスや視覚クオリティ設定をドライバ毎、スクリーン毎、プリケーション毎レベルでカスタマイズできます。|https://dri.freedesktop.org/wiki/DriConf/|{{AUR|driconf}}}}


=== ハードウェアビデオアクセラレーション ===
=== ハードウェアビデオアクセラレーション ===
307行目: 340行目:
[[AMDGPU#オーバークロック]] や [[NVIDIA/ヒントとテクニック#オーバークロックを有効化する]] を参照してください。
[[AMDGPU#オーバークロック]] や [[NVIDIA/ヒントとテクニック#オーバークロックを有効化する]] を参照してください。


=== PCI Resizable BAR を有効化する ===
=== PCIe resizable BAR を有効化する ===


{{Note|
{{Note|
* 一部のシステムでは、PCI Resizable BAR を有効化するとパフォーマンスが大幅に劣化する可能性があります。システムのベンチマークを行って、PCI Resizable BAR がパフォーマンスを向上させていることを確認してください。
* 一部のシステムでは、PCIe resizable BAR を有効化するとパフォーマンスが大幅に劣化する可能性があります。システムのベンチマークを行って、PCI resizable BAR がパフォーマンスを向上させていることを確認してください。ただし、新しい Intel Arc の専用 GPU では、resizable BAR は Intel によって推奨されており、ほとんどの場合でパフォーマンスを向上させるでしょう
* 効果を発揮させるには、[[Wikipedia:Unified Extensible Firmware Interface#CSM booting|Compatibility Support Module (CSM)]] を無効化しなければなりません。
* 効果を発揮させるには、[[Wikipedia:Unified Extensible Firmware Interface#CSM booting|Compatibility Support Module (CSM)]] を無効化しなければなりません。
}}
}}


PCI の仕様では、PCI デバイスのメモリを PCI コントローラに公開するために、より大きい[[wikipedia:PCI_configuration_space#Standardized_registers|基底アドレスレジスタ (BAR)]] を使用できます。そうすることで、ビデオカードのパフォーマンスを向上できる可能性があります。ビデオメモリ全体にアクセスすることでパフォーマンスを向上できますし、グラフィックドライバの最適化も可能になります。Resizable BAR、above 4G decoding、そしてドライバ最適化の組み合わせを、AMD は [https://www.amd.com/en/technologies/smart-access-memory AMD Smart Access Memory] と呼んでおり、初期は AMD Series 500 チップセットマザーボードで利用できましたが、後に UEFI アップデートを通して AMD Series 400 と Intel Series 300 以降に拡張されました。この設定はすべてのマザーボードで利用できるわけではなく、特定のボードではブート問題を引き起こすことが知られています。
PCI の仕様では、PCI デバイスのメモリを PCI コントローラに公開するために、より大きい[[Wikipedia:PCI configuration space#Standardized registers|ベースアドレスレジスタ]] (BAR) を使用できます。そうすることで、ビデオカードのパフォーマンスを向上できる可能性があります。ビデオメモリ全体にアクセスすることでパフォーマンスを向上できますし、グラフィックドライバの最適化も可能になります。Resizable BAR、above 4G decoding、そしてドライバ最適化の組み合わせを、AMD は [https://www.amd.com/en/gaming/technologies/smart-technologies.html AMD Smart Access Memory] と呼んでおり、初期は AMD Series 500 チップセットマザーボードで利用できましたが、後に UEFI アップデートを通して AMD Series 400 と Intel Series 300 以降に拡張されました。この設定はすべてのマザーボードで利用できるわけではなく、特定のボードではブート問題を引き起こすことが知られています。


BAR のサイズが 256M の場合、この機能は有効化されていないか、サポートされていません:
BAR のサイズが 256M の場合、この機能は有効化されていないか、サポートされていません:


{{hc|1=# dmesg {{!}} grep BAR=|2=
{{hc|1=# journalctl -k --grep=BAR=|2=
[drm] Detected VRAM RAM=8176M, BAR=256M}}
[drm] Detected VRAM RAM=8176M, BAR=256M
}}


有効化するには、マザーボード設定で "Above 4G Decode" か ">4GB MMIO" という名前の設定を有効化してください。BAR が大きくなっていることを確認するには:
有効化するには、マザーボード設定で "Above 4G Decode" か ">4GB MMIO" という名前の設定を有効化してください。BAR が大きくなっていることを確認するには:


{{hc|1=# dmesg {{!}} grep BAR=|2=
{{hc|1=# journalctl -k --grep=BAR=|2=
[drm] Detected VRAM RAM=8176M, BAR=8192M}}
[drm] Detected VRAM RAM=8176M, BAR=8192M
}}

{{Note|NVIDIA GPU においては、ファームウェアで有効化されていたとしても、[[NVIDIA]] ドライバは Resizable BAR を自動的に有効化しません。UEFI で Above 4G Decoding と Resizable BAR を有効化することに加えて、Resizable BAR をドライバ側で明示的に有効化する必要があります:

{{hc|/etc/modprobe.d/nvidia-rebar.conf|2=
options nvidia NVreg_EnableResizableBar=1
}}

その後、[[initramfs を再生成]]してください。そうすることで、ブート時の早期段階で NVIDIA カーネルモジュールがロードされるときにこのオプションが適用されます。

PCIe Resizable BAR を完全に有効化するには、シャットダウンし、なおかつ一旦電源を切る必要があるかもしれません。
}}

Resizable BAR の状態は {{ic|lspci -vv}} で確認できます。GPU の BAR サイズが 256 MB よりも大きくなっているはずです (例は 16 GB VRAM を搭載した NVIDIA 4070Ti Super です):

{{hc|1=# lspci -vv -d ::03xx {{!}} grep BAR|2=
Capabilities: [bb0 v1] Physical Resizable BAR
BAR 0: current size: 16MB, supported: 16MB
BAR 1: current size: '''16GB''', supported: 64MB 128MB 256MB 512MB 1GB 2GB 4GB 8GB 16GB
BAR 3: current size: 32MB, supported: 32MB
}}


== RAM、スワップ、OOM 処理 ==
== RAM、スワップ、OOM 処理 ==
333行目: 388行目:


=== RAM オーバーレイ上に root を置く ===
=== RAM オーバーレイ上に root を置く ===

{{Out of date|liveroot スクリプトはメンテナンスされていないようです。しかし、このアプローチは依然として機能するはずです。}}


書き込みが遅いメディア (USB や 回転 HDD) を使う場合、(ディスク上の) 読み取り専用の root の上で RAM オーバーレイを作って root を動作させることができます。root に書き込みできる領域が制限されるかわりにパフォーマンスが劇的に改善します。{{AUR|liveroot}} を見て下さい。
書き込みが遅いメディア (USB や 回転 HDD) を使う場合、(ディスク上の) 読み取り専用の root の上で RAM オーバーレイを作って root を動作させることができます。root に書き込みできる領域が制限されるかわりにパフォーマンスが劇的に改善します。{{AUR|liveroot}} を見て下さい。


=== Zram または zswap ===
=== zram 内のスワップや zswap ===

[[zswap]] や [[zram#スワップとしての使用|zram 内のスワップ]]を使うことで、似たような利点を (同じくらいのコストで) 得られます。これら2つは一般に意図が似ていますが、動作が異なります:

* zswap は、圧縮された RAM キャッシュとして動作し、ユーザ空間の設定をあまり必要としません (と同時に許可もしていません)。スワップデバイスと組み合わせて、スワップのキャッシュとして動作します。スワップに入りそうなページは、代わりに zswap に入る可能性があります。

* zram は、RAM 内に圧縮されたブロックデバイスを作成できるカーネルモジュールです。この圧縮されたブロックデバイスはスワップデバイスとして使用でき、他のスワップデバイスと組み合わせる必要はありません。多くの設定オプションがあり、例えばコールドページを保持しておくバッキングデバイスを使用するかどうかも指定できます。


両方とも[[スワップ]]サブシステムを呼び出すため、スワップに影響を与える設定はこれらのシステムにも影響を与えます。例えば、[[swappiness]] は、メモリが圧迫している状況で、カーネルがファイルキャッシュをドロップするか、ページをスワップに移動させるかのどちらを優先させるかを指定します。Zswap はページのスワップへの移動動作をインターセプトし、zram もスワップとして動作するため、このオプションはこれら2つのメカニズムがどれくらいの頻度で使用されるかにも影響を与えます。
[[zswap]] や [[zram]] を使うことで、同様の利点を (同様のコストで) 得られます。これら2つは一般に意図が似ていますが、操作が異なります。zswap は、圧縮 RAM キャッシュとして機能し、高コストなユーザ空間の設定を要求しません (そして、許可もしません)。[[zram]] は、RAM 内に圧縮ブロックデバイスを作成するために使用できるカーネルモジュールです。[[zswap]] はスワップデバイスと組み合わさって機能するのに対し、[[zram]] は補助スワップデバイスを必要としません。


===グラフィックカードの RAM を使う===
=== グラフィックカードの RAM を使う ===


稀なケースとして、RAM 容量が非常に小さいが、ビデオ RAM に余りがある場合、後者をスワップとして使用できます。[[ビデオメモリにスワップ]] を参照してください。
稀なケースとして、RAM 容量が非常に小さいが、ビデオ RAM に余りがある場合、後者をスワップとして使用できます。[[ビデオメモリにスワップ]] を参照してください。
346行目: 409行目:
=== メモリ不足の状況におけるシステムのレスポンスを改善する ===
=== メモリ不足の状況におけるシステムのレスポンスを改善する ===


従来の GNU/Linux システム (特にグラフィカルワークステーション) では、割り当てられたメモリがオーバーコミットすると、カーネル内の OOM killer がトリガーされるか、十分な量のメモリが開放される (システムが応答しない場合、メモリを大量消費するアプリケーションを閉じることは難しいため、これはすぐには起こり得ないでしょう) まで、システム全体のレスポンスがほぼ使用不能な状態まで低下します。挙動は特定の環境や条件に依存しており、通常のレスポンス状態に戻るまでには数秒から30分以上かかる場合があります。会議でのプレゼンテーションなどのような重要な状況においては、待つのが苦痛になるでしょう。
従来の GNU/Linux システム (特にグラフィカルワークステーション) では、割り当てられたメモリがオーバーコミットすると、カーネル内の out-of-memory (OOM) killer がトリガーされるか、十分な量のメモリが開放される (システムが応答しない場合、メモリを大量消費するアプリケーションを閉じることは難しいため、これはすぐには起こり得ないでしょう) まで、システム全体のレスポンスがほぼ使用不能な状態まで低下します。挙動は特定の環境や条件に依存しており、通常のレスポンス状態に戻るまでには数秒から30分以上かかる場合があります。会議でのプレゼンテーションなどのような重要な状況においては、待つのが苦痛になるでしょう。


[https://lore.kernel.org/lkml/d9802b6a-949b-b327-c4a6-3dbca485ec20@gmx.com/T/ カーネル]と[https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/XUZLHJ5O32OX24LG44R7UZ2TMN6NY47N/ Fedora] のメーリングリストで議論されている通り、メモリ不足の状況におけるカーネルとユーザ空間の挙動は将来的に改善されるかもしれませんが、ユーザは、システムのハードリセットや {{ic|vm.overcommit_*}} [[sysctl]] パラメータの調整よりも実行可能で効果的なオプションを使うことができます:
[https://lore.kernel.org/lkml/d9802b6a-949b-b327-c4a6-3dbca485ec20@gmx.com/T/ カーネル]と[https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/XUZLHJ5O32OX24LG44R7UZ2TMN6NY47N/ Fedora] のメーリングリストで議論されている通り、メモリ不足の状況におけるカーネルとユーザ空間の挙動は将来的に改善されるかもしれませんが、ユーザは、システムのハードリセットや {{ic|vm.overcommit_*}} [[sysctl]] パラメータの調整よりも実行可能で効果的なオプションを使うことができます:
363行目: 426行目:
* {{App|low-memory-monitor|GNOME 開発者の取り組み。ユーザ空間のアプリケーションにメモリ不足の状態を伝えるためのより良いコミュニケーションを提供することを目的としており、さらにカーネルの OOM killer をトリガーするように設定することができます。PSI ベースで、Linux 5.2+ を必要とします。|https://gitlab.freedesktop.org/hadess/low-memory-monitor/|{{AUR|low-memory-monitor-git}}}}
* {{App|low-memory-monitor|GNOME 開発者の取り組み。ユーザ空間のアプリケーションにメモリ不足の状態を伝えるためのより良いコミュニケーションを提供することを目的としており、さらにカーネルの OOM killer をトリガーするように設定することができます。PSI ベースで、Linux 5.2+ を必要とします。|https://gitlab.freedesktop.org/hadess/low-memory-monitor/|{{AUR|low-memory-monitor-git}}}}
* {{App|uresourced|アクティブなグラフィカルユーザセッションに対して、cgroup ベースのリソース保護を有効化する小さなデーモン。|https://gitlab.freedesktop.org/benzea/uresourced|{{AUR|uresourced}}}}
* {{App|uresourced|アクティブなグラフィカルユーザセッションに対して、cgroup ベースのリソース保護を有効化する小さなデーモン。|https://gitlab.freedesktop.org/benzea/uresourced|{{AUR|uresourced}}}}
* {{App|bustd|非常に軽量な OOM killer。低速なマシンで便利です。PSI をベースとしており、Linux 4.2+ が必要です。|https://github.com/vrmiguel/bustd|{{AUR|bustd}}}}

== ネットワーク ==

* カーネルネットワーキング: [[Sysctl#パフォーマンスを向上させる]] を参照
* NIC: [[ネットワーク設定#MTU とキューの長さの設定]] を参照
* DNS: キャッシュ付きの DNS リゾルバの使用を検討してください。[[ドメイン名前解決#DNS サーバ]] を参照
* Samba: [[Samba#Improve throughput]] を参照

== Watchdog ==

[[wikipedia:ja:ウォッチドッグタイマー]]より:

:ウォッチドッグタイマーはコンピュータの動作に支障が生じていないか確認して復旧するために使われる電子的なタイマーである。通常、コンピュータは定期的にウォッチドッグタイマーをリセットする。何らかの理由でウォッチドッグをリセットできなかった場合、タイマーによってタイムアウト信号が生成され、コンピュータを安定状態に移行して通常のシステムオペレーティングを復旧させるなどの対応が行われる。

システムがミッションクリティカルな役割 (サーバーなど) を担う場合や電源のリセットができない場合 (組み込みデバイスなど)、上記のようなウォッチドッグ機能が必要となります。ユースケースによってはウォッチドッグ機能はシステム運用に不可欠な存在です。一方で、普通のユーザー (デスクトップやノートパソコンユーザー) にとっては不要な機能であり無効化しても問題ありません。

(ソフトウェアとハードウェア両方の) ウォッチドッグタイマーを無効化するには、ブートパラメータに {{ic|nowatchdog}} を追加してください。

AMD Ryzen CPU を使用している場合、[[journal]] で {{ic|sp5100-tco}} も確認してください。これは [[Wikipedia:AMD_700_chipset_series|AMD 700 チップセットシリーズ]]内部のハードウェア watchdog です。これを無効化するには、以下を作成してください:

{{hc|/etc/modprobe.d/disable-sp5100-watchdog.conf|
blacklist sp5100_tco
}}

あるいは、{{ic|1=modprobe.blacklist=sp5100_tco}} [[カーネルパラメータ]]を使用してください。

{{ic|cat /proc/sys/kernel/watchdog}} か {{ic|wdctl}} で新しい設定が機能していることを確認してください。

ロードされるモジュールが減ることで起動やシャットダウンが高速化されます。さらに、ウォッチドッグを無効にするとパフォーマンスが向上し、[[電源管理#NMI watchdog の無効化|消費電力も抑えられます]]。

詳しくは [https://bbs.archlinux.org/viewtopic.php?id=163768]、[https://bbs.archlinux.org/viewtopic.php?id=165834]、[https://0pointer.de/blog/projects/watchdog.html]、[https://docs.kernel.org/watchdog/watchdog-parameters.html] を参照してください。


== 参照 ==
== 参照 ==
399行目: 432行目:
* [https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Performance_Tuning_Guide/index.html Red Hat Performance Tuning Guide]
* [https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Performance_Tuning_Guide/index.html Red Hat Performance Tuning Guide]
* [https://www.thomas-krenn.com/en/wiki/Linux_Performance_Measurements_using_vmstat Linux Performance Measurements using vmstat]
* [https://www.thomas-krenn.com/en/wiki/Linux_Performance_Measurements_using_vmstat Linux Performance Measurements using vmstat]

{{TranslationStatus|Improving performance|2026-03-12|864653}}

2026年3月12日 (木) 12:46時点における最新版

この記事では、知覚または計測できるシステムパフォーマンスの向上を最終目的として、パフォーマンスに関連する基本的なシステム診断、及び、リソース消費量の削減やシステム最適化のための手順に関する情報を提供しています。ゲーミングおよび低レイテンシに特有のその他のアドバイスは ゲーム#パフォーマンスを向上させる も参照してください。

基本

システムを知る

システムをチューンするには、全体のスピードを下げているボトルネックやサブシステムに狙いを定めるがベストな方法です。システムの仕様を知ることは、それらを特定することに役立ちます。

  • (LibreOffice や Firefox などの) 巨大なアプリケーションを同時に動作させたときにコンピュータが遅くなる場合、RAM の容量が十分であるか確認してください。以下のコマンドを使って、"available" 列の値を確認してください:
    $ free -h
  • 起動時間が長い場合、または、アプリケーションを初めて起動するとき (だけ) にロードに長い時間が掛かる場合、おそらくハードドライブが遅過ぎます。ハードドライブの速度を計測するには hdparm コマンドを使うことができます:
    # hdparm -t /dev/sdX
    ノート hdparm で出力されるのはハードドライブの純粋な読み込み速度なので、有効なベンチマークとは言えませんが、平均的なコンピュータでは (アイドル状態のときに) 40MB/s より高い数値が出るのが妥当です。
  • 十分な RAM が利用できる時でも CPU 負荷が一貫して高い場合、不要なデーモンやプロセスを無効化するなどして CPU 使用量を減らすことを試みてください。htoppstree などのシステム監視ツールで CPU 負担をモニタすることができます:
    $ htop
  • ダイレクトレンダリングを使うアプリケーション (つまり、ビデオプレイヤ、ゲーム、ウィンドウマネージャなどの GPU を使うアプリケーション) が遅い場合、GPU パフォーマンスを向上させることで解決するはずです。まず初めにダイレクトレンダリングが有効になっているかどうか確認しましょう。glxinfo コマンドを使うことで確認できます (mesa-utils パッケージに含まれています)。次のコマンドを実行すると direct rendering: Yes と表示される必要があります:
    $ glxinfo | grep "direct rendering"
  • デスクトップ環境を動かしている場合、(不要な) 視覚デスクトップ効果を無効化することで GPU 使用率を削減できる場合があります。現在使用しているものがハードウェアや個人の要件に合わない場合、より軽量な環境を使用するか、カスタムの環境を作成しましょう。
  • 最適化されたカーネルを使用することでパフォーマンスを向上できます。一般に linux-zen が良い選択肢です。しかし、この記事の特定の部分で説明されているように、デフォルトのカーネルを調節することで良いパフォーマンスを得られます。

ベンチマーク

最適化の効果を判断できないことがたびたびあります。そういった場合はベンチマークツールで計測することができます。

ストレージデバイス

セクタサイズ

NVMe ドライブや Advanced Format ハードディスクが適切な論理セクタサイズを使用していることを確認してください。

パーティショニング

パーティションが適切にアライメントされていることを確認してください。

複数のドライブ

複数のドライブを持っているのであれば、ソフトウェア RAID を組んでパフォーマンスを劇的に向上させることができます。

スワップを別のディスク上に作成することでもパフォーマンスを多少向上させることができます。特に、スワップが頻繁に発生する場合です。

SSD を HDD のキャッシュとして使う

ハードディスクから移行することができない場合、ソリッドステートドライブをキャッシュレイヤとして使うことで読み書き速度を向上させ、ランダムアクセスによるパフォーマンスの低下を減らすことができます。方法としては、LVM#キャッシュBcacheBcachefs#SSD キャッシング があります。

HDD でのレイアウト

従来の回転式 HDD を使用している場合、パーティションのレイアウトがシステムのパフォーマンスに影響を与える可能性があります。ドライブの最初のセクター(ディスクの外周の近く)は最後のセクターよりも高速です。また、パーティションを小さくすれば必要なドライブヘッドの移動が少なくなり、ディスク操作をスピードアップできます。従って、システムのために作るパーティションは小さく (15~20GiB、必要に応じて調節) して、できるだけドライブの最初に配置することが推奨されます。他のデータ(画像・動画など)は別のパーティションに置くべきです。通常、システム (/) から home ディレクトリ (/home) を分割することでこれを達成できます。

ノート このページのすべてのアドバイスにおいて言えることですが、得られる利益を計測してください: ハードドライブをショートストロークしたり、合計容量の数%しか使わないようにしたりしない限り、一般的な使用においては読み書き操作が依然としてドライブ全体に及ぶため、パーティションを分割してもほんの数%しかアクセス時間は改善されません。それと比べて、SSD にアップグレードするとパフォーマンスが1桁以上向上します。

ファイルシステムの選択とチューニング

ファイルシステムごとに強みが異なるのでシステムごとにファイルシステムを選ぶことはとても重要です。ファイルシステムの記事に人気のあるファイルシステムの簡単な説明がされています。カテゴリ:ファイルシステムから関連記事も見ることができます。

マウントオプション

様々な *atime オプションが、strictatime のパフォーマンスのペナルティを軽減することができます。

他のマウントオプションはファイルシステム固有なので、ファイルシステムの関連記事を参照してください:

カーネルパラメータの調整

ブロックデバイスのパフォーマンスに影響するキーが複数存在します、詳しくは sysctl#仮想メモリ を見て下さい。

I/O スケジューラの設定

背景情報

入出力 (I/O) スケジューラはストレージデバイスにブロック I/O の操作を送信するときの順番を決めるカーネルコンポーネントです。I/O スケジューラの目的は読み込みリクエストを最適な方法で扱うことであるため、以下の2つのドライブの特徴を押さえておくことが重要です:

  • HDD は回転ディスクでありヘッドが物理的に必要な場所に移動します。そのため、ランダムアクセスは 3〜12ms と非常に遅くなります (ハイエンドサーバーのドライブなのかノートパソコンのドライブなのか、あるいはディスクコントローラの書き込みバッファを迂回するかなどで速度は変わります)。逆に連続アクセスなら高いスループットを得ることが可能です。連続アクセスならヘッドはほとんど動かなくてよいためです。典型的な HDD は毎秒200回ほどの I/O リクエストを処理することができます (IOPS)
  • SSD には物理的に移動する部品がありません。ランダムアクセスはシーケンシャルアクセスと同じ速度が出ます (0.1ms 未満)。SSD は複数のリクエストを一度にこなすこともできます。典型的な SSD のスループットは 10,000 IOPS を超えるため、大抵の場合は必要な仕事量を上回ります。

プロセスを大量に実行してストレージの様々な場所の I/O リクエストを発生させているとき (つまりランダムアクセスをしている状態)、数千の IOPS が生成されますが、普通の HDD では 200 IOPS までしか対応できません。ストレージにアクセスできるまで待機するリクエストの待ち行列が作られることになります。I/O スケジューラはこの待ち行列を最適化します。

スケジューリングアルゴリズム

スループットを改善する方法の一つとして、待機リクエストの順番を論理アドレスで並び替えてできるだけ一番近いリクエストを通すことで、アクセスをリニア化する方法があります。これが elevator スケジューラと呼ばれる Linux の最初の I/O スケジューラでした。

エレベータアルゴリズムの問題点はシーケンシャルアクセスをするプロセスが上手く動かなくなることです。そのようなプロセスは、データブロックを読み取って数マイクロ秒で処理してから次のブロックを読み出します。エレベータスケジューラはプロセスが近くのブロックを呼びだそうとしていることを知らないため、他の場所のリクエストに移ってしまいます。anticipatory IO スケジューラはこの問題を解決します。このスケジューラは、他のリクエストを処理する前に、近くで別の読み取り操作が発生することを予測して、数ミリ秒待機します。

上述のスケジューラはどちらも全体のスループットを改善することを目指していましたが、それによって不幸にも長い間待たされてしまうリクエストも発生していました。例えば、プロセスの多くがストレージ領域の最初の部分をリクエストしていて、不幸なプロセスはストレージの末端付近をリクエストしているような状況を考えて下さい。そのため、開発者は公平なアルゴリズムを作成することを決めて deadline スケジューラが追加されました。deadline スケジューラはアドレスによってキューの順番を決めますが (エレベーターアルゴリズムと同じ)、一定期間、リクエストがキューの中で待機した場合、リクエストを (経過時間によって順番が付けられる) "expired" キューに移動します。スケジューラは先に expired キューをチェックして、リクエストを処理してからエレベーターキューに移動します。このアルゴリズムは公平性のために全体のスループットを犠牲にしているわけです。

Completely Fair Queuing (CFQ) は別のアプローチで問題に取り組みました。CFQ はプロセスの優先度に基づくキューを使ってタイムスライスと許容するリクエストの数を割り当てます。さらに cgroups のサポートを追加することで特定のプロセスグループに一定の IO を予約できるようにしました。これは共有・クラウドサーバーで特に役立ちます。ユーザーはリソースが必要なときに料金を払って IOPS を得られるのです。また、同期 I/O で近くの操作を待機するという anticipatory スケジューラの機能を改良して取り入れています。anticipatoryelevator スケジューラは Linux カーネルから外され、下記のより高度な代替スケジューラに置き換えられました。

Budget Fair Queuing (BFQ) は CFQ のコードをベースにいくつか改善を加えています。各プロセスに固定長のタイムスライスを与えるかわりに、プロセスのセクタ数から計算した "budget" を割り当ててヒューリスティックを用います。BFQ は想定的に複雑なスケジューラであるため、オーバーヘッドが大きく、回転ドライブや低速 SSD に適しています。特に遅い CPU と組み合わせたときに高速なデバイスの足を引っ張ってしまうような場合に有用です。BFQ は個人用のシステムでインタラクティブな作業を行うときに、ストレージデバイスがまるで待機状態のときのように素早く反応することを目標としています。デフォルト設定ではスループットの最大化よりもレイテンシの最小化が優先されているのが特徴です。これにより、ハードドライブにおいてアプリケーションの起動を劇的に加速化させられる場合があります。

Kyber はネットワークルーティングで用いられている積極的なキュー管理テクニックから生まれた新しいスケジューラです。リクエストを制限するメカニズムとして「トークン」を基に実装されています。 リクエストの割当を受けるにはキューイングトークンを必要とすることで、リクエストのスタベーションを防ぎます。ディスパッチトークンによってデバイスの特定の優先度の操作に制限されます。さらに、ターゲットの読み込みレイテンシを定義して、レイテンシ目標を達成するためにスケジューラ自身がチューニングを行います。アルゴリズムの実装は比較的シンプルなので高速なデバイスでも効率的に機能します。

カーネルの I/O スケジューラ

初期のアルゴリズムには既にメインラインから外されているものもあります。公式の Linux カーネルはいくつかの I/O スケジューラをサポートしています。Multi-Queue Block I/O Queuing Mechanism (blk-mq) は I/O クエリを複数のキューに割り当てて、複数のスレッドおよび CPU コアにタスクを分散させます。このフレームワークでは以下のスケジューラが使えます:

  • None、キューイングアルゴリズムは適用されません。
  • mq-deadline は deadline スケジューラ (下記を参照) をマルチスレッドに対応させたスケジューラです。
  • Kyber
  • BFQ

I/O スケジューラの変更

ノート スケジューラーの最適な選択は、デバイスとワークロードの正確な性質の両方によって異なります。 また、MB/秒単位のスループットだけがパフォーマンスの指標ではありません。デッドラインや公平性は全体的なスループットを低下させますが、システムの応答性を向上させる可能性があります。 ベンチマーク は、各 I/O スケジューラのパフォーマンスを示すのに役立つ場合があります。

特定のデバイスで利用可能なスケジューラとアクティブなスケジューラを表示するには (アクティブなスケジューラは角括弧の中):

$ cat /sys/block/sda/queue/scheduler
mq-deadline kyber [bfq] none

全デバイスで利用可能なスケジューラを表示するには:

$ grep "" /sys/block/*/queue/scheduler
/sys/block/pktcdvd0/queue/scheduler:none
/sys/block/sda/queue/scheduler:mq-deadline kyber [bfq] none
/sys/block/sr0/queue/scheduler:[mq-deadline] kyber bfq none

デバイス sda のアクティブな I/O スケジューラを bfq に変更するには:

# echo bfq > /sys/block/sda/queue/scheduler

I/O スケジューラの変更プロセスは、ディスクが回転式か否かに応じて自動化することができ、起動毎に永続化させることができます。例えば、以下の udev ルールは、回転ドライブに対しては bfq を、SSD/eMMC ドライブに対しては bfq を、NVMe に対しては none を設定します:

/etc/udev/rules.d/60-ioschedulers.rules
# HDD
ACTION=="add|change", KERNEL=="sd[a-z]*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"

# SSD
ACTION=="add|change", KERNEL=="sd[a-z]*|mmcblk[0-9]*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="bfq"

# NVMe SSD
ACTION=="add|change", KERNEL=="nvme[0-9]*", ENV{DEVTYPE}=="disk", ATTR{queue/scheduler}="none"

再起動するか、強制的に新しいルールをロードしてください。

IO スケジューラの調整

カーネルの I/O スケジューラには遅延・期限時間や FIFO パラメータなどそれぞれ設定項目が存在します。特定のデバイスとワークロードの組み合わせにあわせてアルゴリズムを調整することが可能です。スループットを高めたり遅延を少なくしたりするときに用います。 設定項目と説明は カーネルドキュメント で確認できます。

特定のデバイスで設定可能なパラメータを確認するには (以下の例では sdbdeadline を使用しています):

$ ls /sys/block/sdb/queue/iosched
fifo_batch  front_merges  read_expire  write_expire  writes_starved

レイテンシを犠牲に deadline のスループットを高めるには以下のコマンドで fifo_batch を増やします:

# echo 32 > /sys/block/sdb/queue/iosched/fifo_batch

電源管理設定とライトキャッシュ

従来の回転ディスク (HDD) を使用する場合は、省電力機能を完全に無効にするか下げるかし、書き込みキャッシュが有効になっているかどうかを確認すると良いかもしれません。

Hdparm#電源管理の設定Hdparm#ライトキャッシュ を参照してください。

後で、起動時にこれらを適用する udev ルール を作成することができます。

ヒント GNOME では、"ディスク" アプリケーションからこれらのパラメータのいくつかを設定でき、udev ルールは必要ありません。
ノート 一部の機能はあなたのハードドライブではサポートされていないかもしれません。その場合、Hdparm が通知します。なので、この特定の機能の設定を無視してください。

ディスクの読み書きを減らす

遅いストレージデバイスへの不必要なアクセスを避けることはパフォーマンスを向上にとって良いことであり、デバイスの寿命を伸ばすことにも繋がります。ただし最近のハードウェアでは寿命への影響はわずかです。

ノート 書き込み増幅率が平凡な 10x で、書き込み/消去サイクルが標準的な 10000 である、32GB の SSD の場合、毎日 10GB のデータ書き込みを行うと8年間で寿命が尽きるとされます。この数字はもっと容量が大きい SSD を使ったり書き込み増幅が少ない最新のコントローラを使うことで改善されます。また、ディスクの書き込みを制限するのにどの方法が必要なのか考えるときはこの耐久実験も参照してください。

ディスクの書き込みを表示する

iotop パッケージはプログラムをディスクの書き込み数でソートして、どれくらいの頻度でどれだけディスクに書き込んでいるか表示します。詳しくは iotop(8) を見てください。

ファイルを tmpfs に再配置する

ブラウザプロファイルなどのファイルを tmpfs ファイルシステムに再配置してメモリ内に保存することで、アプリケーションのレスポンスを向上させることができます:

  • ブラウザプロファイルを同期させる方法については Profile-sync-daemon を参照してください。特定のブラウザには注意が必要な場合があります。例えば Firefox Ramdisk を参照してください。
  • 任意の指定されたフォルダを同期させる方法については Anything-sync-daemon を参照してください。
  • tmpfs 内でパッケージをビルドすることでコンパイル時間を減らす方法については Makepkg#ビルド時間を短縮する を参照してください。

ファイルシステム

対応するファイルシステムページを参照して、パフォーマンス改善に関する指示があるか見てください。#ファイルシステムの選択とチューニング に挙げられているファイルシステムのリストも参照してください。

スワップ領域

詳細は スワップ#パフォーマンス を見てください。

ライトバックの間隔とバッファサイズ

詳細は Sysctl#仮想メモリ を見てください。

コアダンプを無効化する

コアダンプ#自動的なコアダンプの無効化 を見てください。

ionice によるストレージ I/O スケジューリング

バックアップなど多くのタスクにおいては、そのタスクを実行するために、ストレージ I/O の遅延が短かったり、ストレージ I/O の帯域が大きかったりする必要はありません。そのようなタスクはバックグラウンドタスクに分類することができます。一方、デスクトップにおいて高速な I/O は UI の応答性を高める上で必須です。ゆえに、他のタスクがストレージ I/O を必要としている間は、バックグラウンドタスクによって利用できるストレージ帯域幅を減らすことが有益です。これは、プロセスごとに異なる優先度を設定できる Linux I/O スケジューラ BFQ を使用することで実現できます。

以下のようにバックグラウンドプロセスを実行することで、プロセスの I/O 優先度 "Idle" レベルまで落とすことができます:

$ ionice -c 3 command

詳細は a short introduction to ioniceionice(1) を参照してください。

トリム

最適なパフォーマンスを得るには、SSD の空きブロックを定期的に discard (トリム) してランダム書き込みの速度を最適化するべきです。詳細は ソリッドステートドライブ#TRIM を参照してください。

ネットワーク

一般情報

規制範囲

無線ネットワークサービスには国毎に異なる標準があります。たいてい、ネットワーク構成に応じて正しい範囲を設定すれば、シグナルをより強くできます。これはセットアップ時に設定することが一般的ですが、設定が正しく適用されない場合もあります。/sys/module/cfg80211/parameters/ieee80211_regdom の内容を確認してください; 値が 00 (グローバルな設定であることを示し、通常、制限がより強くなります) である場合や、間違った範囲に設定されている場合、以下のカーネルパラメータを追加してみてください。ただし、XX は正しい国コード (例: 日本の場合は JP です):

cfg80211.ieee80211_regdom=XX

その後、一旦再起動してください。

電源管理

特定のデバイスには、使用中であるにもかかわらずネットワークアダプタが誤って省電力モードに入り、パフォーマンスが低下したり接続が切断されたりする問題があります。そのような場合、パッケージをアップグレードし、必要なファームウェアアップデートを受けられるようにしてください。そして、電源管理#ネットワークインターフェイス を見てください。

CPU

オーバークロック

オーバークロックは、CPU クロック周波数の上限を上げることにより、CPU の計算パフォーマンスを向上させます。オーバークロックできるかどうかは、CPU モデルとマザーボードモデルの組み合わせに依存します。オーバークロックは BIOS を介して行うのが最も一般的です。オーバークロックには欠点とリスクもあります。ここでは推奨も非推奨もしないでおきましょう。

Intel 製のチップの多くは acpi_cpufreq などや他のほとんどのユーティリティに正しいクロック周波数を伝えません。この結果、dmesg は極端なメッセージを表示します (これは、acpi_cpufreq カーネルモジュールをアンロードしてブラックリスト化することで回避可能です)。クロック速度を読むには、i7zAUR パッケージの i7z を使用してください。オーバークロックされた CPU が正しく動作していることを確認する方法として、ストレステストが推奨されます。

周波数スケーリング

CPU 周波数スケーリングを見てください。

CPU スケジューラ

メインライン Linux カーネルのデフォルトの CPU スケジューラは EEVDF です。

  • Project C — BMQ を Project C にリファクタリングするためのクロスプロジェクト。Project C コードベースに基づいて PSD を再作成します。よって、これは2つのプロジェクトのマージであり、その後 PDS が Project C として更新されます。より最近の開発として推奨されます。
https://cchalpha.blogspot.com/ || linux-prjcAUR
  • BORE — BORE スケジューラは、対話型タスクにおいてある程度の公平性を犠牲にして低レイテンシを実現することに焦点を当てています。CFS の上に構築されており、vruntime コード更新だけに調整されています。なので、他の非公式 CPU スケジューラと比較して、全体的な変更は非常に小さいです。
https://github.com/firelzrd/bore-scheduler || linux-cachyos-boreAUR
  • SCX — システムをリセットせずに様々な CPU スケジューラを動的にロードできるようにします。
https://github.com/sched-ext/scx || scx-scheds

リアルタイムカーネル

(TV チューナーカードをフル HD 解像度 (1080p) で実行するなど) 一部の使用用途では、リアルタイムカーネルを使うと利益を得られる場合があります。

プロセスの優先順位を設定

nice(1)renice(1) も参照してください。

Ananicy

Ananicy CPP は動的に実行可能ファイルの nice レベルを調整するためのデーモンで、ananicy-cppananicy-cpp-gitAUR パッケージで利用可能です。nice レベルとは、CPU リソースを配分するときの実行可能ファイルの優先度を表すものです。

警告 GamemodeAnanicy CPP はどちらもプロセスの nice レベルを調整しようとします。これらのツールを組み合わせて使用することは推奨されていません。[1]

cgroups

cgroups を見てください。

LimitCPU

LimitCPU は特定のプロセスの CPU 使用率を制限するプログラムです。limitcpuAUR をインストールすれば、プロセスの PID で CPU 使用率を 0 から 100 までの値にコンピュータに搭載されている CPU コア数をかけた数字の範囲で制限することができます。例えば、CPU コアが8個であれば利用可能な値は 0 から 800 です。使用例:

$ limitcpu -l 50 -p 5081

irqbalance

irqbalance はマルチプロセッサシステムでパフォーマンスを向上させるためにプロセッサ間でハードウェア割り込みを分散させます。irqbalance.service操作することが可能です。

警告 一部のケースでは、irqbalance が省電力機能に干渉し、ビデオゲームでのスタッタリングやフレームレート低下を引き起こす可能性があります。[2]

CPU の脆弱性の緩和策をオフにする

警告 以下の設定を使うときは問題の脆弱性について確認してください。特に、緩和策が無効化されている場合、信頼できないプログラムを隔離する方法として仮想マシンを使ってはなりません。詳しくは こちらこちら のページを参照。

CPU の脆弱性の緩和策をオフにすることで、パフォーマンスが向上する場合があります。以下のカーネルパラメータですべての緩和策が無効になります:

mitigations=off

このパラメータによって切り替えられるすべてのスイッチについての説明は、kernel.org で見られます。spectre-meltdown-checkerAURlscpu(1) (util-linux に同梱) を使うことで、脆弱性チェックを行うことができます。

ノート 第10世代およびそれ以降の Intel CPU、または AMD Ryzen シリーズ 1000 およびそれ以降の CPU を使用している場合、緩和策を無効化することにより得られるパフォーマンスの向上は、最大でも 5% にとどまります。一方、それ以前の世代の CPU では、最大 25% まで向上します。2021 初頭における総評Rocket Lake におけるテストAlder Lake におけるテスト を参照。

CPU に合わせてコンパイルをチューニングする

CPU によっては、ソフトウェアのコンパイル時に -march=native フラグを使って、搭載されている CPU のマイクロアーキテクチャに合わせてソフトウェアのコンパイルをチューニングすると、パフォーマンスを少し向上できる場合があります。ただし、このフラグを使ってコンパイルしたバイナリは、他の CPU マイクロアーキテクチャ上では遅くなってしまうか、正しく動作しません。このオプションを使用していて、なおかつ CPU を変更あるいはアップグレードしたい場合は、バイナリを再コンパイルするか、新しい CPU には今の CPU と同じマイクロアーキテクチャのものを選ぶ必要があります。このオプションは makepkg でデフォルトとして設定することもできます

カーネルを自身でコンパイルする場合は、CONFIG_X86_NATIVE_CPU オプションでカーネルのコンパイル中にこのフラグを有効化できます。しかし、通常のバイナリでパフォーマンス向上の寄与度が大きい拡張ベクトル命令を Linux カーネルは汎用のコード内で禁じているため、カーネルのパフォーマンス向上はより小さいでしょう。そのため、カーネルのパフォーマンス向上のほとんどは、より小さなマイクロ最適化によるものになります。

グラフィック

Xorg の設定

グラフィックパフォーマンスは xorg.conf(5) の設定に依存している場合があります。NVIDIAAMDGPUIntel の記事を参照してください。不適切な設定は Xorg が動作しなくなる原因になるため、注意しましょう。

Mesa の設定

Mesa ドライバのパフォーマンスは drirc で設定できます。adriconf (Advanced DRI Configurator) はオプションを設定して標準の drirc ファイルに書き込むことで MESA ドライバを設定する GUI ツールです。

ハードウェアビデオアクセラレーション

ハードウェアビデオアクセラレーションにより、ビデオカードに動画のデコード/エンコードをさせることができます。

オーバークロック

CPU と同様に、(GPU の) オーバークロックは直接的にパフォーマンスを向上できますが、一般には推奨されません。いくつかのパッケージがあります: rovclockAUR (ATI カード)、rocm-smi-lib (最近の AMD カード)、nvclockAUR (古い NVIDIA カード - Geforce 9 まで)、nvidia-utils (最近の NVIDIA カード)。

AMDGPU#オーバークロックNVIDIA/ヒントとテクニック#オーバークロックを有効化する を参照してください。

PCIe resizable BAR を有効化する

ノート
  • 一部のシステムでは、PCIe resizable BAR を有効化するとパフォーマンスが大幅に劣化する可能性があります。システムのベンチマークを行って、PCI resizable BAR がパフォーマンスを向上させていることを確認してください。ただし、新しい Intel Arc の専用 GPU では、resizable BAR は Intel によって推奨されており、ほとんどの場合でパフォーマンスを向上させるでしょう。
  • 効果を発揮させるには、Compatibility Support Module (CSM) を無効化しなければなりません。

PCI の仕様では、PCI デバイスのメモリを PCI コントローラに公開するために、より大きいベースアドレスレジスタ (BAR) を使用できます。そうすることで、ビデオカードのパフォーマンスを向上できる可能性があります。ビデオメモリ全体にアクセスすることでパフォーマンスを向上できますし、グラフィックドライバの最適化も可能になります。Resizable BAR、above 4G decoding、そしてドライバ最適化の組み合わせを、AMD は AMD Smart Access Memory と呼んでおり、初期は AMD Series 500 チップセットマザーボードで利用できましたが、後に UEFI アップデートを通して AMD Series 400 と Intel Series 300 以降に拡張されました。この設定はすべてのマザーボードで利用できるわけではなく、特定のボードではブート問題を引き起こすことが知られています。

BAR のサイズが 256M の場合、この機能は有効化されていないか、サポートされていません:

# journalctl -k --grep=BAR=
[drm] Detected VRAM RAM=8176M, BAR=256M

有効化するには、マザーボード設定で "Above 4G Decode" か ">4GB MMIO" という名前の設定を有効化してください。BAR が大きくなっていることを確認するには:

# journalctl -k --grep=BAR=
[drm] Detected VRAM RAM=8176M, BAR=8192M
ノート NVIDIA GPU においては、ファームウェアで有効化されていたとしても、NVIDIA ドライバは Resizable BAR を自動的に有効化しません。UEFI で Above 4G Decoding と Resizable BAR を有効化することに加えて、Resizable BAR をドライバ側で明示的に有効化する必要があります:
/etc/modprobe.d/nvidia-rebar.conf
options nvidia NVreg_EnableResizableBar=1

その後、initramfs を再生成してください。そうすることで、ブート時の早期段階で NVIDIA カーネルモジュールがロードされるときにこのオプションが適用されます。

PCIe Resizable BAR を完全に有効化するには、シャットダウンし、なおかつ一旦電源を切る必要があるかもしれません。

Resizable BAR の状態は lspci -vv で確認できます。GPU の BAR サイズが 256 MB よりも大きくなっているはずです (例は 16 GB VRAM を搭載した NVIDIA 4070Ti Super です):

# lspci -vv -d ::03xx | grep BAR
Capabilities: [bb0 v1] Physical Resizable BAR
                BAR 0: current size: 16MB, supported: 16MB
                BAR 1: current size: 16GB, supported: 64MB 128MB 256MB 512MB 1GB 2GB 4GB 8GB 16GB
                BAR 3: current size: 32MB, supported: 32MB

RAM、スワップ、OOM 処理

クロック周波数とタイミング

RAM は BIOS で設定することで、クロック周波数とタイミングを別々にすることができます。メモリのパフォーマンスは両方の値によって変わります。BIOS に用意されている最高速のプリセットを選択することでデフォルト設定よりも性能を上げることができます。マザーボードやメモリのメーカーがサポートしていない周波数まで値を高めると、CPU のオーバークロックと同じようなリスクがあるので注意してください。#オーバークロックを参照。

RAM オーバーレイ上に root を置く

この記事またはセクションは情報が古くなっています。
理由: liveroot スクリプトはメンテナンスされていないようです。しかし、このアプローチは依然として機能するはずです。 (Discuss)

書き込みが遅いメディア (USB や 回転 HDD) を使う場合、(ディスク上の) 読み取り専用の root の上で RAM オーバーレイを作って root を動作させることができます。root に書き込みできる領域が制限されるかわりにパフォーマンスが劇的に改善します。liverootAUR を見て下さい。

zram 内のスワップや zswap

zswapzram 内のスワップを使うことで、似たような利点を (同じくらいのコストで) 得られます。これら2つは一般に意図が似ていますが、動作が異なります:

  • zswap は、圧縮された RAM キャッシュとして動作し、ユーザ空間の設定をあまり必要としません (と同時に許可もしていません)。スワップデバイスと組み合わせて、スワップのキャッシュとして動作します。スワップに入りそうなページは、代わりに zswap に入る可能性があります。
  • zram は、RAM 内に圧縮されたブロックデバイスを作成できるカーネルモジュールです。この圧縮されたブロックデバイスはスワップデバイスとして使用でき、他のスワップデバイスと組み合わせる必要はありません。多くの設定オプションがあり、例えばコールドページを保持しておくバッキングデバイスを使用するかどうかも指定できます。

両方ともスワップサブシステムを呼び出すため、スワップに影響を与える設定はこれらのシステムにも影響を与えます。例えば、swappiness は、メモリが圧迫している状況で、カーネルがファイルキャッシュをドロップするか、ページをスワップに移動させるかのどちらを優先させるかを指定します。Zswap はページのスワップへの移動動作をインターセプトし、zram もスワップとして動作するため、このオプションはこれら2つのメカニズムがどれくらいの頻度で使用されるかにも影響を与えます。

グラフィックカードの RAM を使う

稀なケースとして、RAM 容量が非常に小さいが、ビデオ RAM に余りがある場合、後者をスワップとして使用できます。ビデオメモリにスワップ を参照してください。

メモリ不足の状況におけるシステムのレスポンスを改善する

従来の GNU/Linux システム (特にグラフィカルワークステーション) では、割り当てられたメモリがオーバーコミットすると、カーネル内の out-of-memory (OOM) killer がトリガーされるか、十分な量のメモリが開放される (システムが応答しない場合、メモリを大量消費するアプリケーションを閉じることは難しいため、これはすぐには起こり得ないでしょう) まで、システム全体のレスポンスがほぼ使用不能な状態まで低下します。挙動は特定の環境や条件に依存しており、通常のレスポンス状態に戻るまでには数秒から30分以上かかる場合があります。会議でのプレゼンテーションなどのような重要な状況においては、待つのが苦痛になるでしょう。

カーネルFedora のメーリングリストで議論されている通り、メモリ不足の状況におけるカーネルとユーザ空間の挙動は将来的に改善されるかもしれませんが、ユーザは、システムのハードリセットや vm.overcommit_* sysctl パラメータの調整よりも実行可能で効果的なオプションを使うことができます:

  • Magic SysRq キー (Alt+SysRq+f) で手動でカーネルの OOM killer をトリガーする。
  • ユーザ空間の OOM デーモンを使ってこれに自動的 (または対話的) に対処する。
警告 OOM killer をトリガーして実行中のアプリケーションを kill すると、保存されていない作業が失われる場合があります。アプリケーションが最終的に通常通りメモリを開放してくれることを期待して辛抱強く待つか、あるいは応答がないシステムを可能な限り早く通常に戻したいと望むかは、あなた次第です。

カーネルの OOM killer では終了する (しない) プロセスに優先順位を付けられないので、SysRq よりも OOM デーモンのほうが好ましい場合もあります。いくつかの OOM デーモンをリストアップしました:

  • systemd-oomdsystemd によって systemd-oomd.service として提供されています。cgroups-v2 と pressure stall information (PSI) を使用してプロセスを監視し、カーネル空間で OOM が発生する前にアクションを取ります。
https://github.com/systemd/systemd, systemd-oomd(8) || systemd
  • earlyoom — C で書かれた、シンプルなユーザ空間の OOM killer 実装です。
https://github.com/rfjakob/earlyoom || earlyoom
  • oomdPSI ベースの OOM killer 実装です。Linux カーネルバージョン 4.20+ を必要とします。設定は JSON で行い、非常に複雑です。Facebook の本番環境において動作確認済み。
https://github.com/facebookincubator/oomd || oomdAUR
  • nohang — Python で書かれた、洗練された OOM ハンドラ。オプションで PSI サポートあり。earlyoom よりも設定可能です。
https://github.com/hakavlad/nohang || nohang-gitAUR
  • low-memory-monitor — GNOME 開発者の取り組み。ユーザ空間のアプリケーションにメモリ不足の状態を伝えるためのより良いコミュニケーションを提供することを目的としており、さらにカーネルの OOM killer をトリガーするように設定することができます。PSI ベースで、Linux 5.2+ を必要とします。
https://gitlab.freedesktop.org/hadess/low-memory-monitor/ || low-memory-monitor-gitAUR
  • uresourced — アクティブなグラフィカルユーザセッションに対して、cgroup ベースのリソース保護を有効化する小さなデーモン。
https://gitlab.freedesktop.org/benzea/uresourced || uresourcedAUR
  • bustd — 非常に軽量な OOM killer。低速なマシンで便利です。PSI をベースとしており、Linux 4.2+ が必要です。
https://github.com/vrmiguel/bustd || bustdAUR

参照

翻訳ステータス: このページは en:Improving performance の翻訳バージョンです。最後の翻訳日は 2026-03-12 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。