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

推薦する

Centos7サーバーの基本的なセキュリティ設定手順

pingスキャンをオフにする(役に立たないが)まずルートに切り替えるエコー 1 > /proc...

MySQL 5.7.17 圧縮パッケージのインストールと設定方法のグラフィックチュートリアル

インターネット上にはMySQL 5.7.17のインストールチュートリアルがほとんどなく不十分なので、...

反応ルーティングでパラメータを渡すいくつかの方法についての簡単な説明

最初のパラメータ渡し方法は、動的ルーティングパラメータ渡しです。リンクのパス属性を設定することで、ル...

LinuxでJenkinsのパスワードを忘れる方法

1.Jenkinsのインストール手順: https://www.jb51.net/article/1...

Dockerイメージを完全にアンインストールする手順

1. docker ps -a 実行中のイメージプロセスを表示する [root@mylinux~]#...

MySQL 5.7.13 ソースコードのコンパイル、インストール、および構成方法のグラフィックチュートリアル

インストール環境: CentOS7 64ビットMINI版公式ソースコードのコンパイルおよびインストー...

Tencent インタビュー: SQL ステートメントの実行が非常に遅くなる理由は何ですか? ---後悔シリーズは見ないで(推奨)

正直に言うと、この質問には MySQL のコア知識がかなり必要で、コンピュータ ネットワークの知識を...

CSS3 を使用した SVG パス ストロークのアニメーション化入門チュートリアル

JavaScript に依存せず、純粋な CSS を使用してsvgストローク描画アニメーション効果と...

Mysql のフィールドのデータの一部をバッチ置換する (推奨)

MYSQL のフィールドのデータの一部をバッチで置き換えます。具体的な導入は次のとおりです。 1....

MySQL マスタースレーブ同期遅延の原因と解決策

歴史的な理由により、MySQL レプリケーションは、REDO ログではなく論理バイナリ ログに基づい...

MySQL インデックスの設計と最適化の方法

目次インデックスとは何ですか?左端のプレフィックス一致の原則key_lenの計算方法インデックスの最...

MySQL内部一時テーブルの具体的な使用法

目次連合テーブルの初期化ステートメントの実行連合の結果ユニオンオールグループ化十分なメモリステートメ...

Docker Composeのデプロイと基本的な使い方の詳しい説明

1. Docker Composeの概要Compose は、マルチコンテナ Docker アプリケー...

WeChat アプレットのカスタム タブバー コンポーネント

この記事では、WeChatアプレットのカスタムタブバーコンポーネントの具体的なコードを参考までに紹介...

MySQL接続がハングする理由の詳細な説明

目次1. 背景建築問題現象2. 分析プロセス接続プール不安に陥る雲を晴らして光を見よう3. 解決策I...