Hasty Briefsbeta

双语

A 40-Line Fix Eliminated a 400x Performance Gap

4 months ago
  • #Performance
  • #Linux-Kernel
  • #OpenJDK
  • OpenJDK中40行代码的改动,将原本缓慢的`/proc`文件解析方法替换为`clock_gettime()`来测量线程CPU时间,实现了30-400倍的性能提升。
  • 旧方法需要读取并解析`/proc/self/task/<tid>/stat`文件,涉及多次系统调用、文件I/O和复杂字符串解析,导致高延迟(尤其在并发场景下)。
  • 新方案采用`clock_gettime(CLOCK_THREAD_CPUTIME_ID)`,通过单次系统调用直接访问内核线程调度数据,规避了文件操作和解析开销。
  • Linux内核在`clockid_t`中编码时钟类型信息,使得JVM可以通过位操作请求仅用户态CPU时间,绕过了POSIX标准只能提供总CPU时间(用户态+内核态)的限制。
  • 进一步优化发现:通过手动构建PID=0的`clockid`可跳过内核基数树查找,获得了额外13%的性能增益。
  • 该修复方案凸显了重新审视传统假设、利用内核内部机制,以及权衡POSIX规范与平台特定优化的重要性。