包处理线程阻塞导致丢包
分类:
现象:
某项目报告故障,业务流量下降严重,只有平时流量的1/10,
到现场查看驱动日志,网卡有2Gbps入流量,但90%多都被应用丢弃了,
gdb attach 应用进程发现,大量线程都被阻塞了,主要原因是connect某个ip地址阻塞了,
而那个ip所属的服务器因硬件崩溃,连不上了,
虽然connect加了超时,但也要等待N秒才能返回错误,这N秒期间已经丢了上百万个数据包。
解决办法:
恢复在线系统运行优先,先将故障ip从配置文件删掉,暂时不给那台机器发数据,
(那个IP属于某模块后端集群之一,临时禁用一台影响不太大,只是把流量分担给其他正常服务器),
报硬件故障,待机器修复后,再恢复正常配置。
经验教训:
此项目是几年前开发、上线,目前相关公共库的connect已经支持异步模式,
除此之外,任何可能导致阻塞的操作,都不应该在sapp的包处理线程上下文中调用,
包括上述的connect, send, write, recv等网络IO类,
还有:pthread_mutex_lock, pthread_cond_wait等。
除此之外,慎用磁盘I/O类接口,磁盘的读写速度要比内存慢的多,
由于系统其它进程频繁读写文件操作,也可能导致fopen, fwrite等函数执行很长时间才返回,
包处理线程最好不要用同步方式写日志。
查看评论
暂无评论