daily memorandum 2.3.0
CBUG | FreeBSD | Hiki | Knoppix | Mac | Ruby | W-ZERO3 | Windows | ad | amd64 | ks | linux | momonga | net | print | security | tdiary | unix | www | 会社 | 鯖缶 | 全学ゼミ | 本
2005-03-03 (Thu)
_ [linux] システム中のファイルを開きすぎです
長くなりそうなので、自分とこに書こう。 ちなみに、以下 Linux kernel の version は 2.4.26 です。
えっと、まず結論に近いところから書くと、 fs/file_table.c の get_empty_filp() に
if (files_stat.nr_files < files_stat.max_files) {
という部分があって、これが false だと get_empty_filp() は NULL を返すことになり *1、 従って do_pipe() (fs/pipe.c) で ENFILE が返ることになる。
ということで、次は files_stat.nr_files の値をどうやって見るかなのだけど、 これは kernel/sysctl.c を見ると、
static ctl_table fs_table[] = {
(略)
{FS_NRFILE, "file-nr", &files_stat, 3*sizeof(int),
0444, NULL, &proc_dointvec},
{FS_MAXFILE, "file-max", &files_stat.max_files, sizeof(int),
0644, NULL, &proc_dointvec},
(略)
なんてコードがあって、/proc/sys/fs/file-nr を見れば、 files_stat (struct files_stat_struct) を表示してくれそうだとわかる。 試しに表示してみると、
% cat /proc/sys/fs/file-nr 1535 103 65528
ってな感じ。ちなみに、struct files_stat_struct の定義は
struct files_stat_struct {
int nr_files; /* read only */
int nr_free_files; /* read only */
int max_files; /* tunable */
};
となっているので(include/linux/fs.h), 1st column が問題の nr_files だということがわかる。
そんなわけで、現在開いているファイル数(というのは厳密な言い方じゃないかも) を見たければ、てきとーな時間間隔で /proc/sys/fs/file-nr を cat して 1st & 3rd column をチェキするのがよさげ。
*1 本当はこいつが true でも、次の kmem_cache_alloc() にしくると NULL が返るのだけど、今回は省略。
_ [FreeBSD] ports TODO
3/15 の ports freeze までにやっておきたいこと。優先度順。
- xpdf 何とかする。さすがに現状の ports の状態はいろいろとよろしくない(FreeBSD の IRC で「日本語使えねーぞ、ゴルァ」って話もあったし)。せめて [ports-jp 15508] のままでも commit してもらわないと。
- tamoさんの日記によると、結構前に mutt-1.5.7 が release されているみたいなので(どこが変わったのかは調べてないけど)、ports の方も上げておく。
- amd64 で kterm 動くようにする。まぁ、立ち上がらないってのは critical なので、freeze 後でも portmgr にゴネれば patch 突っこめるかな(アマイ?)。
週末はあと2回しかないので急がないといけないのだが、 体に力が入らないというか、無駄に時間が過ぎていく今日このごろ。 困ったもんだ。
[追記(3/5)] 2件、ほぼ片付いた。