static void
ReleaseLruFiles(void)
{
while (nfile + numAllocatedDescs >= max_safe_fds)
{
if (!ReleaseLruFile())
break;
}
}
也就是说当: (vfd打开的数量nfile) + (其他路径直接调用fd.c接口打开文件数量numAllocatedDescs) 超过max_safe_fds时触发LRU淘汰。
fd.c
set_max_safe_fds
count_usable_fds(max_files_per_process, &usable_fds, &already_open);
max_safe_fds = Min(usable_fds, max_files_per_process - already_open);
计算逻辑在count_usable_fds中:
count_usable_fds中会使用dup复制stdin描述符并存下来,重复这个动作直到EMFILE发生(fd用尽),这时记录:
最终:
max_safe_inodes = min(当前进程OS限制还能打开多少个
, max_files_per_process-当前进程已经打开多少个
)