読者です 読者をやめる 読者になる 読者になる

ちょっとだけメモリコンパクション

Linuxでメモリ断片化が起きたらどうしたらよいのだろうというか断片化らしき現象に直面してしまって、基本的にスタック変数しか使っていないプログラミングだったのだけどC++なので実際はヒープ使い放題なプログラムである。詳しくは書かないけどTCPコネクションを切るだけでメモリの使用量が1/100くらいに減るとかいうひどい現象。ちなみにjemalloc使っても断片化は起きてしまって、メモリ配置がきれいだから断片化の修復(コンパクション?)が比較的高速に終わるとかいう。
いろいろググッているうちに2007年に/proc/sys/vm/comapct_nodeとかいうのを作るパッチを投稿している人がいたがさすがにちょっと古杉だろうということで最新のカーネルを引っ張りだしてきてソースをうろうろしていたらmm/comapt.cとかいうファイルを見つけたのでそれだろうと思う。でよく見たら最新のドキュメントでは2.6.29以降で全部使えるぜー!とか言ってるので自分のDebian stableでaptitude install linux-source-2.6.32とかやってみたらmm/compact.cがない。これはひどい。
2010年にも改良してるみたいだけど、いつから入ってるのだろう…blameしてchangesetがどこのかを調べたらいいのかな。なんか楽な方法ないかしら。しかしMortonさん…LKMLはやはり殺伐としてモヒカンが跋扈しているのでしょうか。
カーネルむずい。
みなさんはどうやってメモリ断片化を防いでいるのでしょうか。簡単に思いつくのは固定長のメモリプール自前管理とか?でも本体のコードを複雑にしたくないよなあ…。スレッド毎に固定長メモリプールを用意してロックなしでゴニョゴニョ、とかやっぱ無理だー