美文网首页
记一次生产事故—CPU使用率飙升(分布式锁设置的问题)

记一次生产事故—CPU使用率飙升(分布式锁设置的问题)

作者: 小胖学编程 | 来源:发表于2022-06-21 17:48 被阅读0次

    非常典型,但是又非常容易出错的地方

    场景:团队内造了一个轮子,即使用Redis实现分布式锁。

    //加锁
    public boolean tryAcquire(String key,long expireTime);
    //释放锁
    public boolean release(String key);
    

    业务代码:

    public void consume(){
      if(tryAcquire(key,30)){
        try{
          //业务逻辑,调用接口全量的拉取数据
        }finally{
          release(key);
        }
      }
    }
    

    然后上线后,CPU飙升。

    详细的排查过程可以参考下文:

    JVM那点事-JDK命令行工具+JProfiler的使用(排查线上问题)
    JVM那点事—show-busy-java-threads排查CPU性能问题

    问题定位到就是

    • GC线程数量上升,导致CPU利用率飙升。
    • 日志出现的是tryAcquire操作无效,大量线程并发的调用接口拉取全量数据;

    最终定位的原因就是:tryAcquire中的expireTime单位是ms,而开发的同学以为这个单位是秒,以为设置30s的超时时间,造成了一次生产事故。

    得到的教训是:方法的参数命名要规范,不能给人一种很模糊的感觉;

    相关文章

      网友评论

          本文标题:记一次生产事故—CPU使用率飙升(分布式锁设置的问题)

          本文链接:https://www.haomeiwen.com/subject/uneevrtx.html