一个DNS请求引起的网络阻塞

前段时间遇到Linux应用程序网络丢包问题,应用程序接收网络报文数据丢失界面展示信息不全.以下是对该问题进行基本的简要分析与定位的过程。

 

在网络转发路径未发现网络传输丢包情况.通过Linux netstat查看gmond应用程序socket状态发现一个奇怪的现象,gmond Recv-Q网络报文数量持续不断增长,且多次查看状态均未出现清零的情况,初步怀疑内核socket接收存在丢包即CPU处理性能瓶颈导致应用程序无法及时接收网络报文。

 

netstat -lnup输出:



htop查看系统应用进程CPU占用率并未发现CPU满负荷运行情况直接排除CPU处理性能瓶颈导致应用程序无法及时接收网络报文。问题转向了gmond应用程序,如何跟踪应用程序系统调用.那就是strace!

 strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用程序工作过程的目的。strace使用方法请参考网上资源.

 

strace -p 2747 输出,发现gmond应用程序间歇性的执行系统调用如下:

一个DNS请求引起的网络阻塞_第1张图片


gmond应用程序在进行DNS请求解析,在Linux下常用gethostbyname函数用于域名解析,其内部会对配置DNS服务器进行遍历递归查询直到域名解析请求成功或域名解析请求超时,同时该接口无法设置timeout超时间直接影响应用程序执行效率。

 

gmond应用程序在进行DNS请求解析,但请求无响应导致间歇性的阻塞等待请求超时,直接导致gmond应用程序接收网络报文异常,解决办法:

1)DNS服务器配置正确网络可达,并设置缺省域名解析即对无法解析域名及时回应DNS解析异常,避免遍历递归查询DNS。

2)在多线程环境避免使用gethostbyname进行域名解析,采用gethostbyname_r网上建议以避免多线程环境采用gethostbyname发生阻塞。

3)对高DNS解析应用程序直接配置本地host直接本地解析提高DNS解析效率。

你可能感兴趣的:(linux)