April 2008

なんで俺のメールは無視されてるんだよーとの苦情に答えて

On Sat, 26 Apr 2008, Adrian Bunk wrote:
>
> Linus takes patches from people like Andrew, Al and Harvey directly,
> but he doesn't take the same patches directly from me.

It's because I hate you.

Oh, no, wait.

It's because you didn't send the patch to me.

Linus




ギャグを言わないと気がすまない所は誰かを彷彿とさせるな。

http://ossmpedia.org/messages/linux/2.6.9-34.EL/482.ja

 物理ページの確保に失敗した。要求したサイズと確保時に指定した空きページの探索方法を表示する。

 物理メモリが不足している場合に発生する。また,空きメモリが充分であっても,物理メモリが断片化し要求サイズ分の物理ページが連続して確保できない場合は発生する。



うーむ、この説明だと普通のときは出ないメッセージであるかのように書いてあるが、んなこたーない。
ネットワーク系のドライバだとパケット受け取った時に、そのデータを格納する用のメモリ確保を行うことが多いのだが、そのときに使われる関数 netdev_alloc_skb() は __GFP_NOWARN を立てない。

かつ、Linuxはメモリ管理哲学としてぎりぎりまでメモリを開放せずにキャッシュとして使い続け、メモリ確保要求が来てから開放する仕組みをとっているが、割り込みの延長からはロックの都合上この開放処理がおこなえないので、通常よりかなり高い確率でメモリ確保は失敗する。

なので、ある種のネットワークカード(特にe1000とtg3)は高負荷時にしばしばpage allocation failureのメッセージを出すが、これは高負荷だったので、パケット1つ捨てたよーーん。という意味でしかなく、どうせ流れてるのはTCP/IPだろうからACKしなきゃ再送してくるっしょ。という意味であり、特に対処は必要ない。

先日Andrew Mortonがe1000にだけスペシャルなハックいれてワーニングを回避しようとしていたので、tg3で起きるよーん。ジェネリックなレイヤで直そうぜーというメールを書いてみたのだが、Dave Millerのお気にめさなかったらしく、物理連続なメモリを要求するハードなんて腐ってるぜー、そんなもののために対応したくないぜー。と却下されてしまった。

# 加えて、古いLinuxのドライバはエラー対応が腐ってるドライバが多いので
# デフォルトをNOWARNにするのはありえないらしい

よって、この問題は技術的な問題ではないので、直る見込みがない。
e1000ユーザは枕を涙で濡らしてください。

#あ、TG3はIOMMUがあるのにドライバが使ってないだけなので、ドライバメンテナが
#ドライバ書き直す宣言をしているので、将来的に直るらしい


BTW: ところで、メッセージペディアの書き込み権限ってどうやったら手に入るのかいね?
こういうの気になるんだけど

http://journal.mycom.co.jp/news/2008/04/18/007/index.html


プロセス管理機構も見直され、プロセスごとのメモリ使用量をかんたんに測定できる機能が追加された。カーネル2.6.25では、プロセスが使用するページに対応する物理ページ配置をプロセスごとに/proc/$PID/pagemapsとして作成、これを他のプロセスと比較することで共有するページを判別できる。共有ページを共有しているプロセスの数で除した数値を持つ「proportional set size (PSS)」と、共有されていないページをカウントした「unique set size (USS)」という2つの統計値も新設された。



この説明はへんだ。
カーネル内にUSSという統計値は存在しない。また、pagemapsというファイルは存在しない(pagemapだ)

pagemapはページのPFNが知りたいときしかほぼ使い道はなくて、
ページ共有されているかどうか。およびUSS、PSSは/proc/$PID/smaps を見る

36c5400000-36c554a000 r-xp 00000000 08:01 18940074 /lib64/libc-2.5.so
Size: 1320 kB
Rss: 508 kB
Pss: 28 kB
Shared_Clean: 508 kB
Shared_Dirty: 0 kB
Private_Clean: 0 kB
Private_Dirty: 0 kB
Referenced: 508 kB
Swap: 0 kB



ここで、
・共有されているものはSharedにカウントされる
・専有されているものはPrivateにカウントされる
・PssはRssを共有数で割ったもの

という規則によりプロセス全体のRSS、PSS、USSは
RSS: アドレス空間毎のRssを合算
PSS: アドレス空間毎のPssを合算
USS: アドレス空間毎のPrivate_Clean + Private_Dirty を合算

で計算できる事になります。
実はpagemapはかなりUI 設計ミスでpte holeもPFN not presentなページをひたすら返すので
64bitアーキで

$ cat /proc/$$/pagemap > pagemap.txt


とかやると、ひどい事になります。さすが組み込み向け。


BTW: ソース見てて気づいたがHugepageの配慮が抜けてるぞー > pagemap

携帯版でDQ2クリアした。
なんというか、バランス調整がされていて、これは僕が知っているDQ2じゃないというか。。

魔法が普通に役に立つとか、サマルトリア王子が普通に使えるとか違和感がたっぷり。とか
あと、この時代は船を入手したらもう終盤だったんだなー。とかとか

まあ、いろいろと感慨深かった。

今日はこんぴゅーたが使えない日という事もあって会社を休んだ。
めどいのでおうちでごろごろしていようかとも思ったが、気分を変えてGoogle Developer交流会に行ってきた。テーマのAndroidにちょっと興味あったし

結論から言うと大はずれ。濃ゆい話が出来る開発者が一人も来とらんやんけ。
交流会名乗るからには、実開発者呼んで来い。広報担当者とかマジいらない

Leeのパッチをデバッグしていて、つくづく思ったがLinuxのanonなリバースマップのデータ構造は素直じゃないね。

なんか最近やけに、うちのブログの検索ワード履歴でjemalloc をみかけると思ったらFirefox3に採用されたんだそーな。
んじゃ、こんどなんか記事かこうかしらね

↑このページのトップヘ