从 ASAN Stuck 到 Open Files Limit

从 ASAN Stuck 到 Open Files Limit

💡 原文中文,约4100字,阅读约需10分钟。
📝

内容提要

在Docker容器中使用AddressSanitizer时,作者遇到了无法输出调用堆栈信息并导致CPU占用的问题。经过两天的调查,他们发现问题是由于文件限制设置引起的。尽管尝试了多种解决方案,问题仍然存在。最终,他们发现问题与容器和主机机器的文件打开限制有关。通过在容器中设置文件限制,他们成功解决了问题。作者建议修改containerd文件描述符限制,并可能修改LLVM源代码以使用替代的系统调用来关闭文件描述符。他们已在GitHub上提出了改进的问题。

🎯

关键要点

  • 在Docker容器中使用AddressSanitizer时,遇到无法输出调用堆栈信息和CPU占用的问题。
  • 问题是由于文件打开数限制设置过大导致的。
  • 通过设置环境变量ASAN_OPTIONS=symbolize=0可以关闭符号解析,顺利输出后续内容。
  • 在宿主机上运行程序时,问题消失,表明与容器的文件限制有关。
  • 通过strace发现AddressSanitizer卡在read系统调用上,推测与llvm-symbolizer交互的流程有关。
  • 在容器内运行ulimit -n发现文件描述符限制为1073741816,而宿主机为1024。
  • 通过在运行容器时添加--ulimit nofile=1024:1024解决了问题。
  • 宿主机的文件限制与Docker容器的限制差异导致了问题。
  • 建议修改Containerd文件描述符限制,或在启动容器时添加限制。
  • 可以考虑修改LLVM源码,使用close_range或closefrom系统调用替代close。
➡️

继续阅读