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

推薦する

React Nativeでaxiosを使用してネットワークリクエストを行う方法

フロントエンド開発では、Ajax、jQuery ajax、axios、fetch など、データ要求を...

MySQL外部キーの基本的な機能と使用方法の詳細な説明

この記事では、例を使用して、MySQL 外部キーの基本的な機能と使用方法を説明します。ご参考までに、...

MySQL 8.0.18 のインストールと設定方法のグラフィック チュートリアル (Linux)

この記事では、Linux MySQL 8.0.18のインストールと設定のグラフィックチュートリアルを...

Clickhouse Docker クラスターの展開と構成を例を使って説明します

目次前面に書かれた環境の展開Zookeeper クラスタの展開Clickhouse クラスターの展開...

Vite2+Vue3を使用してMarkdownドキュメントをレンダリングする練習

目次カスタム Vite プラグインvite-plugin-markdownの使用Front Matt...

VueのkeepAliveコンポーネントの機能と使い方の詳細な説明

序文面接中、多くの面接官は「keep-alive が何をするのか知っていますか?」と質問する際に V...

vue-tableは追加と削除を実装します

この記事では、vue-table の追加と削除の具体的なコードを参考までに紹介します。具体的な内容は...

mysql インストーラ ウェブ コミュニティ 5.7.21.0.msi インストール グラフィック チュートリアル

この記事の例では、Androidの9グリッド画像を表示するための具体的なコードを参考までに共有してい...

CSS カウンターとコンテンツの概要

コンテンツ プロパティは CSS 2.1 で導入され、:before および :after 疑似要素...

MySQL REVOKE でユーザー権限を削除する

MySQL では、REVOKE ステートメントを使用してユーザーの特定の権限を削除できます (ユーザ...

MySQLデータクエリが多すぎるとOOMが発生するかどうかについての簡単な議論

目次サーバー層でのフルテーブルスキャンの影響InnoDB におけるフルテーブルスキャンの影響Inno...

Vue3の組み込みコンポーネントであるTeleportの使い方を詳しく説明します

目次1. テレポートの使用2. モーダルダイアログコンポーネントを完成させる3. コンポーネントのレ...

VMware 15 を使用して仮想マシンをインストールし、CentOS 8 を使用する詳細な手順

序文:現在、Linux と .Net Core を学習しており、クロスプラットフォームの知識を学んで...

Zabbix を使用して Nginx/Tomcat/MySQL を監視する方法の詳細なチュートリアル

目次ZabbixはNginxを監視するZabbixはTomcatを監視するZabbixはMySQLを...