*

OOM Killerの発動を検知したい

公開日: : 最終更新日:2014/12/28 Linux, Ubuntu

今回はプログラムの話。タイトル通り、LinuxのOOM Killerが発動したことを検知したいという話です。組み込みでLinuxを使っていると、OOM Killerが動き出すこと自体異常事態なので、検知してリカバリ処理を挟みたい場合があるのです。「OOM Killerとは何者か」というところはググれば情報がたくさん出てくるのでそちらを参照していただきたく。

さて、そんなわけでLinuxカーネルのソースを見ていたのですが、ちゃんとフックできるようになっていますね。やっぱり同じ要求はあるらしい。register_oom_notifier()でnotifierを登録しておくと、OOM Killerが発動したタイミングで呼んでもらえるようです。

さっそく実験。以下のようなカーネルモジュールを書きました。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/notifier.h>
#include <linux/oom.h>
#include <linux/err.h>

static int
hoom_oom_handler(struct notifier_block *self, unsigned long val, void *parm)
{
	printk(KERN_INFO "Raised OOM killer!\n");
	return NOTIFY_OK;
}

static struct notifier_block hoom_oom_nb = {
	.notifier_call = hoom_oom_handler
};

static int
hoom_init(void)
{
	int err;

	if ((err = register_oom_notifier(&hoom_oom_nb)) < 0) {
		printk(KERN_INFO "probe error %d\n", err);
		return err;
	}
	return 0;
}
module_init(hoom_init);

static void
hoom_exit(void)
{
	unregister_oom_notifier(&hoom_oom_nb);
}
module_exit(hoom_exit);

MODULE_LICENSE("GPL");

 

カーネルモジュールを組み込んだ時実行される hoom_init()の中でregister_oom_notifier()を呼んで、hoom_oom_handler()をnotifierとして登録しています。OOM Killerが発動したら、"Raised OOM killer!”という文字列がカーネルのログに出力されます。

ビルド用のKbuildは以下の通り。

obj-m := mod_hookoom.o
mod_hookoom-objs := hookoom.o

 

ビルドした手順、は長くなるので次回書きます。

ビルド後にこれをinsmodして組み込みました。なお組み込みLinuxを想定した調査ですが、実験はUbuntu 14.04(カーネル3.13.0-43)を載せた仮想マシン上で行っています。

~/work/hookoom>$ sudo insmod mod_hookoom.ko
~/work/hookoom>$
~/work/hookoom>$ lsmod
Module                  Size  Used by
mod_hookoom            12571  0
:

 

さて次はOOM Killerを発動させないといけません。メモリリークを意図的に起こすということで、このとき使ったmemeaterというプログラムをまたビルドして実行しました。すると、

~/work/memeater>$ ./memeater
強制終了
~/work/memeater>$

 

意図通り強制終了されました。

このときカーネルログを確認したところ、

~/work/memeater>$ dmesg
:
[  187.009487] Raised OOM killer!
[  187.009655] memeater invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
:
[  187.010420] Out of memory: Kill process 1262 (memeater) score 943 or sacrifice child
[  187.010505] Killed process 1262 (memeater) total-vm:458758196kB, anon-rss:1284992kB, file-rss:28kB
:

 

見事memeaterが OOM KillerにKillされたログとともに、”Raised OOM Killer!”がログ出力されました。

つづく

関連記事

25eth0_trouble

Windows 8.1上でHyper-Vを試す ~ネットワークがつながらない~

前回、Hyper-V上の仮想マシンにUbuntuをインストールしたところまで書きました。 インスト

記事を読む

36export_thumb.png

Hyper-VでUbuntu 14.04を試す(3)

前回、仮想マシンにUbuntu 14.04をインストールしました。 続いて環境整備。 まずはI

記事を読む

no-ia32-libs_thumb.png

Ubuntu 14.04 64bitで32bitアプリを使う

新たにVMを作ってUbuntu 12.04から14.04に乗り換えたわけですが、セットアップしていて

記事を読む

6memflush_thumb.png

Hyper-Vの動的メモリは本当に動的だった!?

前回、無用なトラブルを避けるつもりで無難な選択をした結果、却ってロクでもない目に遭ったようだという話

記事を読む

22installer

Windows 8.1上でHyper-Vを試す ~Ubuntuの仮想マシンを作る(2)~

前回、空の仮想マシンを作るところまで書きました。 (なんか長かった…)。 続いてUbuntu

記事を読む

raised1

カーネルモジュールのビルド

前回、OOM Killerの発動を検知するテスト用のカーネルモジュールをビルドしたと書きました。前回

記事を読む

1enable_hyperV_thumb.png

Windows 8.1上でHyper-Vを試す ~Ubuntuの仮想マシンを作る(1)~

Linuxのカーネルソースをあれこれいじるにあたって、実験用のLinux環境が欲しくなり、新たにUb

記事を読む

am1h-hyperV-perfmon-2_thumb.png

Hyper-V 対 VMware Player対決

先日、バーチャルマシン上でプログラムをビルドすると時間がかかってしようがない。ビルドするならやっぱネ

記事を読む

building_ubuntu_kernel

Ubuntuのカーネル再構築

実験用に作ったUbuntu13.10の仮想マシン上で、Linuxカーネルの再構築を試しました。 ま

記事を読む

25eth0_trouble_thumb.png

E: Internal Error, No file name for libssl1.0.0

Ubuntu 12.04機を(も)使っています。動かなくなると困る一台なので、なかなか更新する勇気が

記事を読む

junctioned_VideoLAN_thumb.png
WindowsタブレットのProgram FilesをSDHCへ逃す

ここ数ヶ月、比較的低価格なWindowsタブレットが相次いで発売されて

raised1
カーネルモジュールのビルド

前回、OOM Killerの発動を検知するテスト用のカーネルモジュール

raised1
OOM Killerの発動を検知したい

今回はプログラムの話。タイトル通り、LinuxのOOM Killerが

1cpu_thumb.jpg
さよならK6-Ⅲ

何か物悲しいタイトルですが、K6-Ⅲ搭載PCを廃棄しました。かつて色ん

25eth0_trouble_thumb.png
E: Internal Error, No file name for libssl1.0.0

Ubuntu 12.04機を(も)使っています。動かなくなると困る一台

→もっと見る

PAGE TOP ↑