【监控】WebServer入库与缓存更新代码优化小计

问题描述:nginx

  经过WebServer将监控数据入库到Hbase,在入库以前须要将指标与ip的列表更新到缓存中,以便前台页面随时选择查看。前两天上了一些新用户致使负载增长,逐渐发现某些用户的监控场景出现丢数据的状况,估计Tps要在1w以上。丢数据会致使前段曲线毛刺增长,体验极差,因此优化WebServer的接收程序须要立马执行。缓存

 

解决过程:多线程

  查看GC,YGC频繁,但FGC基本不多发生,因此丢数据应该不是GC停顿致使的。既然是加了量致使,那么应该跟处理的性能有关。在看一遍代码,看出了问题。首先写入模块实现的简单粗暴,当时为了不多线同步问题,链接-写入-关闭实如今了一个方法体内。另外此时发现CPU也很是的高,这个以前并无在乎(以前是加入了更新缓存的功能,可是CPU升高并无引发在乎),当时觉得是量增大致使,因而先利用nginx加了机器,发现问题并无解决。从新了入库代码,单例同步方式将数据添加到Buffer,而后达到必定的阈值刷写到Hbase。再一看,还没解决,可是YGC明显减小。CPU仍是很高,打开日志查看还有一些由于并发修改致使的异常,定位问题所在,就是更新缓存的模块出了问题。一看代码,确实有几个HashMap没有加同步,只要一遇到异常,那么serverlet线程就退出本次操做,因此后续的消息入库也就无从谈起。以前的量级不大,而且不是时刻调用,因此,因为并发异常致使的崩溃也不是时常发生。再看代码,代码写得很粗暴,因为是每时每刻都有可能会出现新的数据,因此须要用对缓存的数据作判断要不要更新。其实这是画蛇添足,add方法是密等操做,因此你直接add就行,这样省去不少无谓的比较,判断。并且每次来数据都更新是彻底不必的,由于新数据(主要是一些新添的监控维度和ip)到来的几率不高,而且实时性不必作到彻底实时,因此采用同步add到本地HashMap,而后达到必定阈值在set到memcached之中,这样大大减小无谓的比较已经对缓存的操做。另外在清理过时数据时,能够一天清理一次,判断是不是下一天的开始,若是是下一天,那么就在add中先作一下清理操做,而后在add。并发

 

总结:memcached

  对于无状态转发,nginx是无二之选;性能

  近实时的应用出问题要看是否出现FGC停顿,有时候是要命的;(固然此次不是由于这个引发)优化

  多线程必定考虑同步问题;尽可能不使用多线程;spa

  事先作好批量设计,要清楚各种操做的时耗比例,好比创建链接要比一次写入耗时的多;线程

  权衡实时性与吞吐率,通常而言要考虑吞吐率,在能够忍受的范围稍微下降一下服务质量,性能会有质的飞跃;设计

  幂等操做会省去你不少麻烦的逻辑,也容易提升性能;

  此次犯错误下次就不要再犯,不然对不起你逝去的时间;

相关文章
相关标签/搜索