戯言

つらつらと気づいたことを書いていきます。人狼とか。

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ubuntuカーネルのダウングレード、grub-reboot


2015年2月に、Ubuntu12.04からUbuntu14.04に
バージョンアップした後、週に1度程度、
OSごと落ちるという事象が発生してました。

コンソール上に、突然次のようなメッセージが出て、
OSごと完全に無応答になり、強制再起動するしかなく、
特にログも残っていないという状況でした。

---------------------------------------------------------
INFO: task ****: blocked for more than 120 seconds.
Not tainted *****************
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
:
:
---------------------------------------------------------


落ちるようになった契機は、Ubuntuのバージョンアップです。

事象発生後、カーネルパラメータをいじったり、
javaやその他ソフトのバージョンを変更してみたり、
ドライバ変えてみたり、いろいろ試してみたのですが、
解決には至りませんでした。。。

どうしようもないので、12.04を再インストールして、
一から環境構築をし直そうかと考えていましたが、
12.04時代に使っていたカーネル(kernel3.2)が、
/boot配下に残っていたので、
試しにこれで起動してみたら、、、、直ったぽいです。

現在は、Ubuntu14.04(kernel3.13)から、カーネルを変更して、
Ubuntu 14.04(kernel3.2)という微妙な環境で動いてます。

OSが落ちるの根本の原因はわかってません。
カーネルとの相性でしょうか。



今回みたいに、試しにカーネルのバージョンを変えて
再起動するときは、grub-reboot コマンドが便利でした。
次回のOS起動時に限り、使用する grub のメニューを指定するコマンドです。

この設定は、次回のOS起動時の一回のみ有効で、
その次のOS起動時には元に戻るので、
試しにカーネルを変更して起動したいときなどに便利です。

次のように使います。

sudo grub-reboot 1

引数で、grubブートメニューの何番目を使用するか指定します。
1番上のメニューを指定する場合は、0です。
サブメニューがある場合は、sudo grub-reboot '1>2’のように、
>の次にサブメニューの表示番目を指定します。

このコマンドを実行して、3.2系カーネルで起動してからは、
OSが落ちることはなくなったので、
常にkernel3.2系で起動するように、grubのブート設定を変更しました。



その後、・・・

OSは落ちなくなったけど、たまに1~2分程度固まったように
遅くなるという事象が発生しまして、
これについては、るる鯖の検索機能の負荷が原因でした。
検索というおまけの機能で、本来の稼働村の動作に
影響があるのはまずいので、
取り急ぎ、検索機能を無効化して、様子を見てます。

データベースの件数も増えてきて、検索にけっこう負荷がかかるように
なってきたっぽいなあ。

今はるる鯖の全ての機能が1つのサーバ上で動いているんですが、
検索だけを別サーバに切り出すとかしないとか・・・。
でも、別のサーバが必要になるし・・・。

検討中。。。。
スポンサーサイト

INFO: task <プロセス名>:<PID> blocked for more than 120 seconds.とコンソール表示され、OSごと無応答になる


INFO: task <プロセス名>:<PID> blocked for more than 120 seconds.とコンソール表示され、OSごと無応答になる。

まだトラブル2を解決できていない時に、だましだましでサーバを動かしていたら、
10時間くらい経過したあたりで、カーネルがハングして、
こんなメッセージが数行コンソールに出てサーバが固まっていました。

INFO: task ****:<PID> blocked for more than 120 seconds.
Not tainted *****************
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.

再起動しても、時間が経つとまた発生して、3回くらいこれで鯖落ちしました。

一応 /proc/sys/kernel/hung_task_timeout_secs は 0 にしておきましたが、
これってハングしたタスクを確認するタイミングの指定であって、
ハングする問題自体を解決するわけではないですよね?
(誤りのご指摘歓迎します)

ハードウェア性能的な問題かと頭をよぎり、やばいなーと思ってて、
対策の見当がついていなかったんですが、
トラブル2を解決したあたりから、
このトラブルも自然に起きなくなりました。

デッドロックなどで急激にIO負荷がかかっていたのが原因? 

よくわからんです。

まーいいや、発生しなくなったっぽいです。

==2015/2/17追記======
頻度は低くなったものの、たまに発生してました。

ちょっとカーネルパラメータ弄って様子見中。





findの結果をtarファイルに纏める。xargsは使わないよ。


結論としては、以下のコマンドを使用します。

find . -name "log*" -print0 | tar -cvz -T - --null -f /tmp/log01.tar.gz

大量ファイルをtar化するときに、よく困るのはコマンド内のワイルドカードを展開した文字列が長すぎて、コマンドラインのバッファがオーバーフローして、コマンドを実行できないというもの。

例えば、

tar cvzf /hoge.tar.gz log*

などとしても、ファイル名がlogで始まるファイルが大量にあると、実行できない。list too long みたいなことを言われます。これは、ワイルドカードが展開されると、

tar cvzf /hoge.tar.gz log00001.html log00002.html ・・・・・・ 

などとなって、コマンド長の制限を超えるためです。
そこで、xargsコマンドを使って回避しようとするんですが、単純にはできない。
xargsコマンドは、バッファに収まる範囲にわけてコマンドを実行してくれるというもので、例えば、

find . -name "log*" | xargs tar cvzf /hoge.tar.gz

などとして利用したとします。
これは、findで引っ掛けた文字列を、バッファをオーバーしないようにtarに渡すことを期待しているんですが、これでは上手くいかない。

なぜなら、展開されると、

tar cvzf /hoge.tar.gz log00001.html log00002.html log00003.html ・・・・・
tar cvzf /hoge.tar.gz log10001.html log10002.html log10003.html ・・・・・

のようなイメージになるので、結果的に一部のファイルのみがtarで纏められてしまい、全ファイルを対象とできないんです。
ちょっと話がそれますが、findでひっかかった大量ファイルを削除するときは、上記のxargsでrmに渡せば問題ないんです。コマンドがわかれても問題ないですからね。でも、すべてのファイルを1つに纏めたいtarだと上手くいかないのです。


そこで、この問題も解決するためには、

find . -name "log*" -print0 | tar -cvz -T - --null -f /tmp/log01.tar.gz

とします。

まず、tar コマンドの -T オプションで対象ファイルの一覧を、指定したファイルから読み込むように指定します。ここでは、-T オプションの後に - を指定しているので、ファイルではなく標準入力から受け取るようにします。これはよくありますね。

で、対象ファイルの一覧を find コマンドで作るのですが、find コマンドに -print0 オプションをつけて、'\0'区切りでリストを作成します。
受け取り側の tar コマンドでは --null オプションをつけて、'\0'区切りと認識して受け取ります。

これで、find コマンドの結果を、一気に tar コマンドに渡すことができます。



人狼のログバックアップで実際に使用したときは、

find ./log \( -name "log1????.*" -o -name "log1????_?.*" \) -print0 | tar -cvz -T - --null -f /tmp/log01.tar.gz

こんな感じです。

find は ()と -o オプションで、複数条件を指定することができます。







上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。