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 の違いの詳細な説明

推薦する

VMware を使用して PXE バッチ インストール サーバーをテストする詳細なプロセス

目次1. 準備1. 環境を整える2. インストール方法3. ネットワークカードの構成2. インストー...

Apache クロスドメイン リソース アクセス エラーの解決策

多くの場合、大規模および中規模の Web サイトでは、静的リソース (フォント ファイル、画像など)...

MySQLトランザクションを実行するための構文とプロセスの詳細な説明

概要: MySQL は、トランザクションをサポートするためにさまざまなストレージ エンジンを提供しま...

Vue のリスナーの基本的な使用例

目次序文1. リスナーの基本的な使い方2. リスナー形式3. ページに入るとすぐに監視とディープモニ...

Vue で v-for を更新する方法

ヒント:配列変更メソッドによりv-forが更新され、ページが更新されます。配列を変更しないメソッド:...

MySQL 使用仕様の概要

1. InnoDBストレージエンジンを使用する必要がありますCPU と IO のパフォーマンスが向上...

DockerでRedisをデプロイして起動する方法

DockerでRedisをデプロイするまずLinuxにDockerをインストールし、次にDocker...

mysql ローカルログインでポート番号を使用してログインできない問題の解決策

最近、Linux を使用してローカルにログインしていたところ、正常にログインできず、次のエラー メッ...

CSS3は三角形の連続拡大効果を実現します

1. CSS3の三角形は特殊効果でズームし続けます11.1 画像プレビュー 11.2 index.h...

Vueカスタム命令とその使用方法の詳細な説明

目次1. 指令とは何ですか? Vue でよく使われる組み込みの v ディレクティブv-if と v-...

サイトマップをウェブページの下部に配置するメリットと例

以前は、ほとんどすべての Web サイトに、すべてのページをリストしたサイトマップ ページがありまし...

MySQL 最適化 query_cache_limit パラメータの説明

クエリキャッシュ制限query_cache_limit は、単一のクエリで使用できるバッファ サイズ...

インストールされていないバージョンの MySQL を使用する手順とパスワードを忘れた場合の解決策

最初のステップは、圧縮されたパッケージを対応するディスクに解凍することです。 2 番目の手順は、cm...

Vueエンジニアがカプセル化しなければならない埋め込み命令の知識のまとめ

目次序文指導の基本フック機能フック関数のパラメータ文章使い方とアイデア成し遂げる汎用性を高める要約す...

JavaScript で文字列を数値に変換する方法

目次1.parseInt(文字列、基数) 2. 数値() 3.parseFloat()主なメソッドは...