Linux システムによって報告される xfs_vm_releasepage 警告問題に対処する方法

Linux システムによって報告される xfs_vm_releasepage 警告問題に対処する方法

問題の説明

最近、いくつかのマシンで、一日のさまざまな時間に次の警告メッセージが表示されました。

3月26日 20:55:03 host1 カーネル: 警告: fs/xfs/xfs_aops.c:1045 xfs_vm_releasepage+0xcb/0x100 [xfs]()
3月26日 20:55:03 host1 カーネル: リンクされているモジュール: nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack iptable_filter ip_tables ebtable_filter ebtables ip6table_
フィルター ip6_tables devlink ブリッジ stp llc xt_multiport sunrpc dm_mirror dm_region_hash dm_log dm_mod intel_powerclamp coretemp intel_rapl iosf_mbi kvm_intel kvm irqbypa
ss crc32_pclmul ghash_clmulni_intel aesni_intel lrw gf128mul glue_helper ablk_helper cryptd iTCO_wdt iTCO_vendor_support dcdbas ipmi_devintf ipmi_si sg pcspkr ipmi_msg
ハンドラー shpchp i2c_i801 lpc_ich nfit libnvdimm acpi_power_meter kgwttm(OE) xfs libcrc32c sd_mod crc_t10dif crct10dif_generic crct10dif_pclmul crct10dif_common crc32c_i
ntel mgag200 drm_kms_helper igb syscopyarea sysfillrect sysimgblt ptp fb_sys_fops ttm pps_core dca ahci drm i2c_algo_bit libahci megaraid_sas i2c_core libata
3月26日 20:55:03 ホスト1 カーネル: fjes [最終アンロード: nf_defrag_ipv4]
3月26日 20:55:03 ホスト1 カーネル: CPU: 10 PID: 224 通信: kswapd0 汚染: G OE ------------ 3.10.0-514.21.2.el7.x86_64 #1
3月26日 20:55:03 ホスト1カーネル: ハードウェア名: Dell Inc. PowerEdge R640/0W23H8、BIOS 1.3.7 2018年2月8日
3月26日 20:55:03 ホスト1 カーネル: 000000000000000 00000000e02a0d05 ffff88103c7ebaa0 ffffffff81687073
3月26日 20:55:03 ホスト1 カーネル: ffff88103c7ebad8 ffffffff81085cb0 ffffea0000687620 ffffea0000687600
3月26日 20:55:03 ホスト1 カーネル: ffff88004a71daf8 ffff88103c7ebda0 ffffea0000687600 ffff88103c7ebae8
3月26日 20:55:03 ホスト1カーネル: コールトレース:
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81687073>] dump_stack+0x19/0x1b
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81085cb0>] warn_slowpath_common+0x70/0xb0
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81085dfa>] warn_slowpath_null+0x1a/0x20
3月26日 20:55:03 ホスト1 カーネル: [<ffffffffa038bfdb>] xfs_vm_releasepage+0xcb/0x100 [xfs]
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81180b22>] try_to_release_page+0x32/0x50
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81196ad6>] 縮小アクティブリスト+0x3d6/0x3e0
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81196ed1>] shrink_lruvec+0x3f1/0x770
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff811972c6>] シュリンクゾーン+0x76/0x1a0
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff8119857c>] balance_pgdat+0x48c/0x5e0
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81198843>] kswapd+0x173/0x450
3月26日 20:55:03 ホスト1カーネル: [<ffffffff810b1b20>] ? wake_up_atomic_t+0x30/0x30
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff811986d0>] ? balance_pgdat+0x5e0/0x5e0
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff810b0a4f>] kthread+0xcf/0xe0
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff810b0980>] ? kthread_create_on_node+0x140/0x140
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff81697698>] ret_from_fork+0x58/0x90
3月26日 20:55:03 ホスト1 カーネル: [<ffffffff810b0980>] ? kthread_create_on_node+0x140/0x140
3月26日 20:55:03 ホスト1 カーネル: ---[ トレース終了 24823c5c7a1ea2be ]---

これらのマシンのカーネルとアプリケーションのクラッシュ情報は、abrtd サービスによって引き継がれます。abrt-cli を通じて概要情報を表示できます。

# abrt-cli リスト --since 1547518209
id 2181dce8f72761585cb6a904dbff1806c1315c27
理由: 警告: fs/xfs/xfs_aops.c:1045 xfs_vm_releasepage+0xcb/0x100 [xfs]()
時刻: 2019年3月23日(土)午後8時30分45秒(中部標準時)
コマンドライン: BOOT_IMAGE=/boot/vmlinuz-3.10.0-514.16.1.el7.x86_64 root=/dev/sda1 ro crashkernel=auto net.ifnames=0 biosdevname=0
パッケージ: カーネル
uid: 0 (ルート)
カウント: 1
ディレクトリ: /var/spool/abrt/oops-2019-03-23-20:30:45-163925-0

カーネルのバージョンは次のとおりです。

セントオス7
Linux ホスト1 3.10.0-514.21.2.el7.x86_64

分析処理

Red Hat ナレッジベース

Red Hat ナレッジベースのドキュメントを参照してください。このタイプの xfs 警告メッセージは、xfs モジュールがコード パスを通過するときに出力されますが、ホストの使用には影響しません。この警告メッセージを回避するには、カーネルを kernel-3.10.0-693.el7 にアップグレードします。詳細については、redhat-access-2893711 を参照してください。

根本的な原因:

これらのメッセージは情報提供を目的としたものであり、システムに悪影響を与えるものではありません。これらのメッセージは、XFS モジュールが XFS コード パスを通過しているために表示されます。

コード分​​析

Red Hat Knowledge Base にはメモリリサイクルに関する情報は記載されていませんが、スタック情報から判断するとカーネルによるメモリリサイクルが原因と思われます。該当時点でのメモリ使用量は以下のとおりです。

04:30:01 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
......
午後8時40分01秒 513940 130976220 99.61 876 104616380 28610584 21.76 92439660 34840920 524
午後8時50分01秒 479896 131010264 99.64 876 104666496 28557292 21.72 92513872 34804240 400
午後9:00:01 455948 131034212 99.65 876 ​​104675712 28588852 21.74 92418724 34926132 572
午後9時10分01秒 556980 130933180 99.58 876 104610352 28552656 21.71 94287212 32983892 900

# sysctl vm.min_free_kbytes
vm.min_free_kbytes = 90112

20:50 から 21:00 の間に使用可能なメモリが増加しなかったため、システムがメモリ回復操作を実行していない可能性があります。カーネル ログのスタック情報によると、関数呼び出しの関係がわかります。

アクティブリストを縮小 -> リリースページを試行 -> xfs_vm_releasepage

//ソース/mm/ファイルマップ.c
3225 int try_to_release_page(構造体ページ*ページ、gfp_t gfp_mask)
3226 {
3227 構造体 address_space * const マッピング = page->mapping;
......
3233 if (マッピング && マッピング->a_ops->リリースページ)
3234 マッピング->a_ops->releasepage(page, gfp_mask); を返す xfs_vm_releasepage
3235 try_to_free_buffers(ページ) を返します。
3236 }

//ソース/fs/xfs/xfs_aops.c
1034 静的整数
1035 xfs_vm_リリースページ(
1036 構造体ページ *ページ、
1037 gfp_t gfp_マスク)
1038 {
1039 int delalloc、未書き込み。
1040 
1041 trace_xfs_releasepage(page->mapping->host, page, 0, 0);
1042 
1043 xfs_count_page_state(ページ、&delalloc、&unwritten);
1044 
1045 の場合 (WARN_ON_ONCE(delalloc))
1046 0 を返します。
1047 if (WARN_ON_ONCE(未書き込み))
1048 0 を返します。
1049 
1050 try_to_free_buffers(ページ) を返します。
1051 }
......
1827 定数構造体アドレス空間操作 xfs_address_space_operations = {
1833 .releasepage = xfs_vm_releasepage、

カーネル ログ kernel: WARNING: at fs/xfs/xfs_aops.c:1045 に対応して、ソース ファイル source/fs/xfs/xfs_aops.c の 1045 行目にスタック情報が出力されていることがわかります。実際、try_to_free_buffers は実行されておらず、すでに次の結果が返されています。

1045 の場合 (WARN_ON_ONCE(delalloc))
1046 0 を返します。

WARN_ON_ONCE は比較的単純で、ソース ファイル source/include/asm-generic/bug.h にあります。

73 #define __WARN() warn_slowpath_null(__FILE__, __LINE__)

85 #define WARN_ON(条件) ({\
...
88 __WARN(); \

136 #define WARN_ON_ONCE(条件) ({ \
....
140 あり得ない(__ret_warn_once)) \
141 if (WARN_ON(!__warned)) \

__WARN 関数はスタック情報内の warn_slowpath_null 関数を呼び出し、次に warn_slowpath_common 関数を呼び出してスタック情報を出力します。

//ソース/カーネル/パニック.c
517 void warn_slowpath_null(const char *ファイル、int 行)
518 {
519 warn_slowpath_common(ファイル、行、__builtin_return_address(0)、
520 TAINT_WARN、NULL);
521 }

463 静的 void warn_slowpath_common(const char *file, int line, void *caller,
464 符号なし汚染、構造体 slowpath_args *args)
465 {
466 警告時にトレースを無効にする();
467 
468 printk(KERN_WARNING "------------[ ここでカット ]-------------\n");
469 printk(KERN_WARNING "警告: %s:%d %pS()\n", ファイル、行、呼び出し元);
470 
471 の場合 (引数)
472 vprintk(args->fmt, args->args);
......
485 print_modules();
486 ダンプスタック();
487 print_oops_end_marker();

このスタック メッセージは、Red Hat ナレッジベースの説明と一致した単なる警告であり、ホストの使用には影響しないことが大まかにわかります。

まとめ

上記のソースファイル内の関数から、kswapd がメモリを解放するときに xfs_vm_releasepage が呼び出される限り、スタック情報を印刷することができます。スタックが印刷されると、try_to_free_buffers 操作が実行されないため、メモリ使用量をチェックしたときに使用可能なメモリは増加しません。スタック情報を表示したくない場合は、disable_trace_on_warning 関数に対応する kernel.traceoff_on_warning カーネルパラメータをオンにすることで、スタックプロンプトをオフにすることができます。ただし、これをオフにすると、他のカーネル情報は印刷されなくなります。したがって、この観点からは、カーネルバージョンをアップグレードする以外にこの情報を回避できる方法はありません。

さて、今回の記事は以上です。この記事の内容が皆さんの勉強や仕事に少しでも参考になれば幸いです。123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Linux システムによって報告される tcp_mark_head_lost エラーの処理方法

<<:  ランキングを取得するためのMySQLソートの例コード

>>:  Vue における $router と $route の違いの詳細な説明

推薦する

MySQL シリーズ 6 のユーザーと認証

目次チュートリアルシリーズ1. ユーザー管理1. ユーザーアカウント2. アカウントの追加と削除3....

vue3 プロジェクトを素早く構築し、関連機能を紹介する vite+ts の詳細な説明

目次ヴィテ建てる構成vite.config.tsルーターtsタイプvue3 の知識設定小道具コンテク...

JS 配列の重複を排除する 9 つの高度な方法 (実証済みで効果的)

序文一般的な方法はここには記載されていませんが、等しいかどうかを判断するための二重ループや、比較のた...

Element-ui NavMenuサブメニューを使用して再帰的に生成する場合のエラーの詳細な説明

ナビゲーションバーのサブメニューを再帰的に生成すると、メニューは正常に生成できるが、マウスをホバーす...

Dockerディスク容量不足の問題を解決する

Docker が配置されているサーバーをしばらく稼働させたところ、サーバーのディスク ディレクトリの...

Sublime / vscode による HTML コード生成の迅速な実装

目次基本的なHTML構造div とクラス名のショートカット キーを生成するクラス名を持つdiv ID...

jsを呼び出すいくつかの方法が整理され、使用が推奨されています

a タグではクリック イベントがよく使用されます。 1. href="javascript...

JavaScript でプロトタイプ パターンを実装する方法

概要プロトタイプ パターンは、プロトタイプ インスタンスによって作成されるオブジェクトの型を指し、こ...

docker+devpi を使用してローカル pypi ソースをビルドする方法

以前、開発で頻繁に pip ダウンロードを使用する必要がありました。pip ソースを国産ソースに変更...

CSS の一部のプロパティの前には「*」または「_」が付きます。

CSS の一部のプロパティの前には「*」または「_」が付きます。さまざまなブラウザを識別する例えば...

MySQLを水平から垂直に、垂直から水平に変換する方法

データの初期化 `test_01` が存在する場合はテーブルを削除します。 テーブル「test_01...

Vue.jsはElement-uiを使用してナビゲーションメニューを実装します

この記事では、Element-uiを使用してvue.jsでナビゲーションメニューを実装するための具体...

スローモーションアニメーション効果を実現するJavaScript

この記事では、スローモーションアニメーション効果を実現するためのJavaScriptの具体的なコード...

RedisとMemcacheの比較と選び方

最近 redis を使っていて、とても便利だと感じているのですが、インメモリ データベースを選択する...

Node.js とブラウザのグローバル オブジェクトの違いの概要

Node.js では、.js ファイルは完全なスコープ (モジュール) です。したがって、var に...