为什么SQL正好挂起940秒?TCP与Async Rust!
💡
原文英文,约2800词,阅读约需10分钟。
📝
内容提要
本文探讨了SQL挂起问题和TCP与Async Rust的应用。作者使用async-backtrace库生成异步堆栈跟踪来诊断SQL挂起问题,发现大部分线程在block_reader_merge_io_async::merge_io_read处被阻塞。作者还使用ChatGPT生成Python脚本来分析日志文件,发现读取时间过长的文件导致SQL系统挂起。作者模拟了TCP连接超时情况,发现opendal未正确实现异步超时逻辑。最后,作者总结了使用的诊断工具,并感谢帮助解决问题的人员。
🎯
关键要点
- 本文探讨了SQL挂起问题及TCP与Async Rust的应用。
- Databend是一个开源的云数据仓库,使用Rust构建,性能受小文件数量影响。
- 用户报告OPTIMIZE TABLE命令偶尔会挂起,完成时间差异大。
- 使用async-backtrace库生成异步堆栈跟踪,发现大部分线程在merge_io_read处被阻塞。
- 通过分析日志,发现读取时间过长的文件导致SQL系统挂起。
- 模拟TCP连接超时情况,发现opendal未正确实现异步超时逻辑。
- 使用ChatGPT生成Python脚本分析日志,识别出极慢的文件。
- TCP超时问题导致SQL挂起,调整net.ipv4.tcp_retries2值后问题得到解决。
- OpenDAL的TimeoutLayer未能正确实现异步超时逻辑,导致未来无法唤醒。
- 总结使用的诊断工具,包括async-backtrace、ChatGPT、tcpdump等。
➡️