最終回 SystemTapで真犯人を捕まえろ!
高田 哲生
前野 真輝
NTT OSSセンタ
2009/3/25
| NTTグループの各社で鳴らした俺たちLinuxトラブルシューティング探偵団は、各社で培ったOSS関連技術を手に、NTT OSSセンタに集められた。普段は基本的にNTTグループのみを相手に活動しているが、それだけで終わる俺たちじゃあない。 ソースコードさえあればどんなトラブルでも解決する命知らず、不可能を可能にし、多くのバグを粉砕する、俺たちLinuxトラブルシューティング探偵団! 助けを借りたいときは、いつでもいってくれ! OS:高田哲生 俺はリーダー、高田哲生。Linuxの達人。俺のようにソースコードレベルでOSを理解している人間でなければ、百戦錬磨のLinuxトラブルシューティング探偵団のリーダーは務まらん。 Web:福山義仁 俺は、福山義仁。Web技術の達人さ。ApacheのようなWebサーバからTomcat、JBossみたいなJava、アプリケーション技術まで、何でも問題を解決してみせるぜ。 DBMS:下垣徹 下垣徹。PostgreSQLの達人だ。開発からサポートまで何でもやってみせらぁ。でも某商用DBMSだけは勘弁な。 HA:田中 崇幸 よぉ! お待ちどう。俺さまこそHAエキスパート。Heartbeatを使ってクラスタを構成する腕は天下一品! HAが好きなんて奇人? 変人? だから何? HaHaHaHa!! 番外編もついに最終回! Linuxトラブルシューティング探偵団の活躍もひとまずの終了を迎えるぜ! 最後はメモリ不足騒動の顛末(てんまつ)。さらにOSの奥深くへ踏み込んだ内容になっていくが、最後までついてきてくれ!
|
||||
/proc/meminfoで物理メモリの詳細な利用状況を把握
前回までで「カーネル空間」の「物理メモリ」を消費し過ぎた結果、OS停止に至った可能性があるというところまで突き止めました。今回は、カーネル空間のどの部分を消費し過ぎていたのか、さらには根本的な原因は何だったのかを追求していきます。
カーネル空間の物理メモリといっても、まずはどの部分のメモリを消費しているのか把握しなければなりません。これを把握するには/proc/meminfoを見るのが最も簡単です。/proc/meminfoの出力例は以下のようなものでした。
MemTotal: 2073208 kB |
上記の値については、原則として以下のような計算式が成り立ちます。
|
|
| メモリ使用量を求める式(1) |
今回重要なのは、この式(1)です。式(1)を図示すると図1のようになります。
![]() |
| 図1 メモリマッピング |
第1回で説明したとおり、InactiveとMemFreeを足したものが利用可能なメモリです。第1回で説明していないVmallocUsed、Slab、PageTablesはカーネル内で確保する領域です。これらについてもう少しだけ詳しく説明しておきます。
VmallocUsed(※)は、カーネル内のvmalloc()というAPI経由で確保されるメモリを想定しています。この領域は、ドライバなどのカーネルモジュールによって確保されることが多く、システムがいったん起動してしまうとあまり増減しません。ただ、x86_64でMMCONFIG(注1)を利用している場合、カーネル内の仮想メモリを256MiB(注2)予約しており、/proc/meminfoのVmallocUsedにはこの値が足し込まれます。しかし実際は、よほどデバイス数が多くない限り、実際に使っているのは数Mbytes程度です。
そこでこの際、MMCONFIG用に予約されている256MiBはVmallocUsedから引いてしまいましょう。具体的には256Mbytes=262144KbytesをVmallocUsedから引いたものを、上記式(1)のVmacllocUsed(※)として計上します。
なお、MMCONFIGを使っているかどうかは下記のコマンドで確認できます。MMCONFIGを使っていなければ、VmallocUsedの値をそのまま使用してください。
# dmesg | grep MMCONFIG |
Slabは、kmalloc()というAPIでメモリを確保する仕組みで、スラブアロケータという仕組みで管理されています。スラブアロケータはカーネル内のメモリプールで、メモリの断片化を防ぐ仕組みが入っており、確保/解放を繰り返すような使い方をするメモリに使われます。
| 関連記事: | |
| Linuxメモリ管理の最先端を探る http://www.atmarkit.co.jp/flinux/rensai/watch2008/watchmema.html |
|
PageTablesは、ページテーブルエントリという「ページ」の管理構造体として利用されているメモリです。ページとは、カーネル内におけるメモリの管理単位で、vmalloc()で確保したメモリにしろ、kmalloc()で確保したメモリにしろ、メモリは基本的にこの単位で割り当てられます。サイズは物理メモリ量に応じて決まり、一度システムが起動してしまえば変化しません。
これらはカーネル内の領域なので、解放することはできません。Activeと併せて「解放不可能なメモリ」ということでまとめられます。
| 注1:Memory Mapped Configuration。デバイスへメモリを割り当てる設定方法の一種 注2:メビバイト。1MiB=2^20 Bytes=1,048,576Bytesとなり、1MBytes(=1000000Bytes)とは値が異なる。 |
| ■コラム /proc/meminfo〜Linuxメモリの地図〜を把握しよう | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/proc/meminfoは第1回で出てきましたが、詳しく説明していませんでした。その出力が意味するところを説明してしまいましょう。
式(2)の中にあるAnonPagesとは、/proc/meminfoの出力内にはありませんが、無名ページ(Anonymous Page)の領域を表しています。無名ページとは、第2回でも少しだけ説明しましたが、ユーザープロセスがmalloc()などで確保したり、プログラム本体用に利用するメモリ領域です。 出力例を見てもらえば分かりますが、AnonPagesは/proc/meminfoには出力されません。RHEL 5など最近のバージョンのカーネルには入っているのですが、RHEL 4時点ではこの値は存在しませんでした。従って、RHEL 4でAnonPagesを把握したい場合は、式(2)の計算式で求めることになります。 |
| 第2回へ | 1/4 |
|
||||||||
|
||||||||
TechTargetジャパン
- 新しい記事も入っていて安心しました (2012/2/7)
Linux Squareのアクセスランキングを公開します。定番の記事ばかりでなく、連載中の記事もよろしくお願いいたします - エラーメッセージをどう扱うか? (2012/2/2)
今回は、スクリプト実行時にエラーが発生したことを知らせるメッセージの扱い方を説明します - ファイルのアップロードを制限する (2012/1/30)
HTTPクライアントがアップロードしてくるファイルの扱いについて解説します。そもそも受け入れる必要があるのか? ということのほかにも、いろいろ設定が必要です - OSに付属するシェルスクリプトを読んで技術を盗む (2012/1/27)
シェルスクリプトマスターに近づくには、他人から技術を盗まなければならない。OS付属のスクリプトから技術を盗もう
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -

