2017-04-04 53 views
0

我有一系列可执行文件在群集上运行,在执行启动时读取一些小配置文件,然后执行大量处理几个小时,然后写出一些数据并出口。我们的系统管理员试图告诉我,我们的文件服务器真的很慢,因为他的分析显示,群集节点在ELF可执行文件中使用NFS磁盘I/O读取的所有时间都已花费很长时间(注:我们的可执行文件只有几MB大小)。这听起来不太合适,因为我的印象是动态链接器在运行时将整个可执行文件加载到内存中,然后运行内存不足。我知道内核在运行时会将可打开的文件描述符留给可执行文件,但我并不认为它一直在读取它。ELF执行期间的Linux内存/磁盘行为

我的问题是,我的理解如何加载可执行文件有缺陷?我发现很难相信内核会不停地对可执行文件进行文件读取以获取指令,因为这将非常缓慢(即使是缓存),因为分支预测几乎不可靠,所以您会花费永远阅读可执行文件磁盘如果你的二进制文件频繁跳转。

回答

1

我的印象是动态链接器在运行时将整个可执行文件加载到内存中,然后运行内存不足。

您的印象不正确。

首先,未成年人不准确:当动态连接器负责加载共享库,主要的可执行文件本身是由内核动态加载程序启动之前加载。

二,目前大多数系统使用demand paging。这些文件是mmap ed,但是代码在访问代码(即尝试执行)之前并未实际加载到内存中。如果你永远不执行程序的某些部分,这些部分都是从来没有加载到内存中。

我觉得很难相信,内核经常做着文件读取可执行文件提取指令

它不不断做到这一点。它通常将代码加载到内存中,代码在那里保留

在没有足够内存的系统上(这称为抖动),可能会从内存中丢弃代码(如果它再次执行,则需要重新加载它)。

,因为分支预测是很难可靠,

分支预测

  1. 有大约无关,与你的问题,并
  2. 非常良好的现代CPU。