我有一台 8 核 Linux 服务器,专门用于为 80 个运行批处理作业的 Linux 客户端提供 NFS 服务。这些客户端总共有 400 个核心,因此通常同时运行 400 个单核批处理作业。
有时,许多批处理作业会尝试同时执行 I/O,并耗尽服务器上的 nfsd 线程数(当前有 80 个)。批处理作业会收到 I/O 错误(例如权限被拒绝)并退出。
我想增加 nfsd 线程的数量,但想知道:
- 在这种情况下设置线程数有哪些经验规则?
- 设置得太高有什么缺点?
参考
- Sun 提供的 NFS 调优指南为 Solaris 提出了一些经验法则,但没有给出这些特定数字的理由,所以我不确定它们如何应用于我的 Linux 服务器。
- 另一个给出了这种调整方法,但是非常主观。
答案1
在理想情况下,您的批处理作业会有一些退避逻辑,并且您会坚持使用 80 个线程。
我绝不是 NFSd 方面的专家,但适用于所有 Linux 应用程序的 Linux 线程规则应该适用。这里的规则是每个线程在内存中占用一定量的空间,实际上,在普通生产服务器(具有两位数的 RAM)上,这个内存量非常小,几乎无关紧要,更紧迫的问题是 NFSd 等应用程序中线程的实现方式 - 信号量。计数信号量是确保在线程情况下不会发生锁定情况的绝佳方法,问题在于信号量跟踪线程并增加和减少计数器以反映“空闲”与“锁定”线程,为了做到这一点,它们必须索引可用线程并检查锁定的线程以适当地提供执行时间,这是以半高效的方式完成的,并且呈指数增长,如果您的 NFSd 需要非常高的速度,您会注意到计算时间的增加大约相当于注册新线程的执行时间的两倍,幸运的是,这是一个非常小的查找时间值(一个指令)(如果您还记得代数,它被称为基数:),您可以拥有非常大的指数而不会出现任何大问题。
太长;没有读到总结 - 如果我是你,我会将线程数限制为你预期的最大并发主机数,但我也会做一些测试以确保执行时间与你的预期值相符。我知道这可能对你没有太大帮助,但如果没有预期的使用场景,分析适当的配置是非常困难的。
另外,顺便提一下,如果你根据 Sun 的数字进行推断,2.2 GHZ 处理器应该能够在 800 个线程的范围内运行而不会出现问题,即使这些数字本质上是任意的,我也觉得你会对我之前的建议感到满意
答案2
不要使用 NFS。NFS 非常适合小文件访问,但在任何类型的负载下都会崩溃。您是否研究过其他一些技术,例如 AFS 或 Hadoop?