このトピックでは、Alibaba Cloud Linux 2 を実行している Elastic Compute Service (ECS) インスタンスの Intel Software Guard Extension (SGX) ドライバーでメモリリークが発生する問題の原因と解決策について説明します。
問題の説明
次の構成の Alibaba Cloud Linux 2 インスタンスの Intel SGX ドライバーでメモリリークが発生すると、システムメモリが枯渇する可能性があります。
イメージ: Alibaba Cloud Linux 2.1903 LTS 64 ビット。
カーネルバージョン:
kernel-4.19.91-23.al7
以前。uname -r
コマンドを実行して、カーネルバージョンを表示できます。インスタンスファミリー: c7t、r7t、または g7t。
ほとんどのメモリは、Intel SGX のテストプロセスアプリケーションによって占有されています。エラー情報は次のように表示されます。
// oom-killer が systemd-journal によって呼び出されました: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), nodemask=(null), order=0, oom_score_adj=0
// systemd-journal cpuset=/ mems_allowed=0
// CPU: 0 PID: 415 Comm: systemd-journal Not tainted 4.19.91-23.al7.x86_64 #1
// ハードウェア名: Alibaba Cloud Alibaba Cloud ECS, BIOS 0.0.0 02/06/2015
// 呼び出しトレース:
// dump_stack+0x66/0x8b
// dump_global_header+0x12/0x10f
// oom_kill_process+0x2cf/0x310
// out_of_memory+0xf7/0x4c0
// __alloc_pages_nodemask+0xf07/0xfd0
// ? blk_flush_plug_list+0xd7/0x220
// pagecache_get_page+0x8c/0x350
// filemap_fault+0x37e/0x6e0
// ext4_filemap_fault+0x2c/0x3b
// __do_fault+0x38/0x170
// do_fault+0x2eb/0x640
// __handle_mm_fault+0x621/0xa20
// ? apic_timer_interrupt+0xa/0x20
// handle_mm_fault+0x106/0x1c0
// __do_page_fault+0x1ba/0x480
// do_page_fault+0x32/0x140
// ? async_page_fault+0x8/0x30
// async_page_fault+0x1e/0x30
// RIP: 0033:0x55a1ca49516f
// コード: 無効な RIP 値です。
// ... (その他のレジスタ情報)
// ホストの制限の結果として / 内のタスクが kill されました
// メモリ情報:
// ... (メモリ情報)
// メモリ不足: プロセス 1431 (app) のスコア 1 を kill するか、子を犠牲にする
// kill されたプロセス 1431 (app) total-vm:33571940kB, anon-rss:320kB, file-rss:48kB, shmem-rss:0kB
// oom_reaper: プロセス 1431 (app) を回収しました。anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
原因
Arch、X86、Kernel、CPU、SGX、および encl.c
の sgx_encl_mm_release_deferred
関数が、Encl 構造体の参照カウントを適切に処理できません。Enclave Page Cache (EPC) メモリを使用するプロセスが fork されると、Encl の参照カウントはゼロ以外になり、暗号化メモリ (EPC) のリークが発生します。物理メモリが使い果たされると、共有メモリを使用して暗号化メモリがスワップアウトされ、最終的に暗号化されていないメモリが使い果たされます。
解決策
カーネルのアップグレードは、互換性と安定性の問題を引き起こす可能性があります。Alibaba Cloud Linux 2 のリリースノートでカーネルの機能を確認し、カーネルバージョンをアップグレードする際は注意してください。
再起動操作によりインスタンスが一時的に停止し、実行中のサービスが中断され、データ損失が発生する可能性があります。そのため、重要なインスタンスデータをバックアップしてから、オフピーク時にインスタンスを再起動してください。
インスタンスのカーネルバージョンが
4.19.91-23.al7.x86_64
以前の場合は、次の手順を実行します。カーネルを最新バージョンにアップグレードします。
// カーネルをアップデートする sudo yum update kernel
新しいカーネルバージョンを有効にするために、インスタンスを再起動します。
// システムを再起動する sudo reboot
インスタンスのカーネルバージョンが
4.19.91-23.al7.x86_64
の場合は、カーネルライブパッチをインストールします。// カーネルホットフィックスをインストールする sudo yum install -y kernel-hotfix-5577959-`uname -r | awk -F"-" '{print $NF}'`