
问
我发现应用有一根访问数据库的连接有异常流量,如何判断是应用哪个逻辑导致了异常行为
实验
先起锅烧一个数据库实例:

我们用 mysqlslap 作为应用:

假设在 MySQL 中,我们认为这根连接有异常流量:

通过 ss 找到这根连接在 mysqlslap 中的句柄号:

我们通过 strace ,输出 mysqlslap 使用这根连接的堆栈:

其中 “-e desc” 表示追踪所有跟文件句柄有关的系统调用,”-k” 表示打印堆栈
可以看到图上打印出了句柄3的一次调用,是 mysqlslap 在做 drop database 的动作
再挑一个句柄3的堆栈,是 mysqlslap 在做 create database 的动作:

找到句柄4的对应操作:

可以看到:
- 句柄3对应的连接的作用是 create/drop database ,进行测试前后的构建和清理工作。
- 句柄4对应的连接的作用是 run task ,对数据库施加任务压力,我们从数据库上看到的异常流量,就是来自于这个逻辑。
本次实验,我们通过连接端口号找到连接句柄,通过连接句柄,定位到连接异常流量的堆栈,能帮助大家定位到业务应用的异常逻辑。
这种方法只适用于 c/c++ 的应用,对于其他语言编写的应用,我们之后会介绍其他方法来诊断。
关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!
