文章预览
作者:morphis 多线程环境下,读写锁是一种常用的同步原语,适用于多读者-多写者的经典问题;合理的使用可以在保证数据一致性的前提下,大幅提升读性能,但不合理的使用可能会导致死锁。本文从一次协程泄露问题入手,分析golang读写锁可能产生死锁的场景,希望读者可以避坑。 一、故障背景 近期线上某个trpc-go服务一直在OOM,据以往查障经验,golang服务发生内存持续上涨大概率是由两个原因导致: 请求量过大,服务处理不过来,造成协程积压,或者资源积压; 协程泄露,由于未正确关闭、或者协程阻塞等原因,导致协程积压。 123平台容器监控如下: 二、排查思路 1. 检查请求量级 第一时间排查了一下服务的请求量和CPU/内存情况,发现 请求量并未上涨 ,内存上涨的同时,CPU并未线性相关上涨,但是 协程数一直在上涨 ;这里就排除了请求积
………………………………