io_uring は、Linux カーネルのパフォーマンス専有型 非同期 I/O インターフェイスです。このトピックでは、作成時の -ENOMEM エラーの原因と解決策について説明します。
原因と解決策
システム メモリ不足
原因
システムの物理メモリが不足している場合、カーネルは
io_uringの初期化または操作に必要なメモリを割り当てることができません。io_uringインスタンスの作成中に、カーネルはロックされたメモリ ページを要求します。システムの合計メモリが十分であっても、ロックされたメモリの制限が低いと、-ENOMEMエラーが発生する可能性があります。次のコマンドを実行して、現在のユーザーが使用可能なメモリを確認します。
ulimit -a次のコマンド出力が返されます。

max locked memoryは、ユーザーが使用可能なロックされたメモリの最大値です。ロックされたメモリとは、ディスクにスワップできないとマークされたメモリ ページのことで、高パフォーマンスと低レイテンシが要求されるシナリオで使用されます。
解決策
root 権限でターゲット プログラムを実行して、lock_memory の制限をバイパスします。
ユーザーが購入した エラスティック コンピュート サービス (ECS) インスタンスの場合は、
sudoコマンドを実行してroot管理者権限に昇格し、ターゲット プログラムを実行します。コンテナー シナリオでは、コンテナーの起動パラメーターに管理者権限が含まれているかどうかを確認します。
たとえば、Docker コンテナーで root としてプログラムを実行する場合でも、
--privileged=true設定を構成しないと、エラーが発生する可能性があります。これは、コンテナーの root ユーザーがホストの root 権限を完全に継承することを防ぎます。警告--privileged=trueは、コンテナーにほぼすべてのホスト権限を付与します。注意して進めてください。
過度に大きい io_uring キュー パラメーター
原因
io_uring は、初期化中に送信キュー (SQ) と完了キュー (CQ) のメモリを割り当てます。キューの深さ (エントリ) が大きいと、使用可能なメモリが不足する可能性があります。
解決策
適切で妥当な io_uring キューの深さを構成します。
過度に大きい entries 値を指定しないでください。 liburing の io_uring_queue_init インターフェイスと io_uring_queue_init_params インターフェイスは、io_uring インスタンスを作成するために使用されます。許可されたメモリ範囲内で entries パラメーターを指定します。
int io_uring_queue_init(unsigned entries,
struct io_uring *ring,
unsigned flags)
int io_uring_queue_init_params(unsigned entries,
struct io_uring *ring,
struct io_uring_params *params);これらの関数インターフェイスの詳細については、liburing をインストールした後、man コマンドを実行してマニュアル ページを表示してください。
sudo yum install liburing -y
man io_uring_queue_init