我们在这里遇到了一些困难,所以我想值得在这个网站上询问。
我们有一个 Java 进程,它将旧的 Sun RPC 连接作为兼容层提供给新系统。在较旧的 SuSE 机器(2007 Xeon,2.6.16)上,一切都运行良好。虽然我们一直在尝试迁移到更现代的 Xeon E5-2670 平台和 RHEL 2.6.32,但进程运行良好,但它占用了所有 CPU 的负载,响应速度比以前的套件慢。客户端负载相同,我们使用更快的服务器磁盘、相同数量的物理核心(尽管现在由于超线程而增加了 2 倍),相同的 RAM(没有被耗尽或交换)。
分析并没有真正揭示任何东西。有人怀疑磁盘运行速度变慢是因为写入了日志(以前是 ext3,现在是 ext4+acl),但这似乎不是什么大问题,“日志负载”也一样。iostat、netstat 看起来都很正常。
我怀疑内核之间的 RPC 处理发生了一些变化,但似乎很难找到太多信息,因为(我猜测)Sun RPC 类型的通信如今并不那么流行。
有什么想法吗?我不指望有人一定能解决这个问题,因为我不能分享太多信息,但也许有人能指出诊断 RPC 和内核开销时要注意什么?
谢谢!
答案1
问题似乎源于透明大页内核的功能。我不确定完整的技术细节,但可以说,禁用以下三个命令可以修复问题:
echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo never > /sys/kernel/mm/transparent_hugepage/enabled
CPU 负载已下降回至迁移到新内核之前的水平。
希望这能对其他人有所帮助,因为我在互联网上找不到与 RPC 无关且与 NFS 无关的东西!:-)
答案2
检查您的代码中的睡眠时间并用实际睡眠时间替换它们 + 检查您的内核配置。