性能优化:弄懂goolg glog原理,提升程序性能

 当弄清一个库的原理时,发现只需要一行环境变量,竟能让程序提升20倍以上性能,瞬间解决应用层瓶颈。


01

Google glog使用

       Google glog是一个实现应用程序级日志库,该库提供C++样式stream的日志记录API,很多开源项目都在使用。如果你正在使用glog,或者打算使用,一定要注意一些事情。

       具体使用方法可以参考帮助文件,简单使用如下:

int main() {
  FLAGS_log_dir = "./log/";
  FLAGS_logbufsecs = 10;
  FLAGS_max_log_size = 256; // MB
  //FLAGS_minloglevel = 2; // GLOG_ERROR
  FLAGS_stop_logging_if_full_disk = true;
  //FLAGS_logbuflevel = 2;
  google::InitGoogleLogging("itest");
  LOG(INFO) << "hello glog";
}

这里强调说一下在glog的使用中,注意以下事项

1)设置minloglevel,哪些级别需要写入日志文件(默认都写日志)

2)设置logbuflevel,哪些级别立即写入文件还是先缓存(默认INFO级别以上都是直接落盘,会有io影响)

3)设置logbufsecs,最多延迟(buffer)多少秒写入文件,另外还有默认超过10^6 chars就写入文件。

4)使用VLOG,不仅方便调试,也方便线上临时排查文件

5)使用LOG_EVERY_N,不用大量打印重复错误日志。

设置变量也只需要一行,如export GLOG_logbuflevel=2。在这里推荐一篇讲glog代码的博客地址(https://izualzhy.cn/glog-source-reading-notes-whole-process)。

注意事项1、2),写日志文件会先加锁,避免同时操纵同一文件,然后会判断是否需要fflush落盘,默认INFO级别以上需要直接落盘。打印了较多的WARNING日志,会导致直接落盘,于是总是有磁盘io阻塞了请求。


02


弄清背后的原理


       glog 仅支持同步日志。它的写入代码可以参考 LogMessage::Flush ,在写入日志的时候使用了互斥锁,因此性能会受 I/O 速度影响。有两个支持异步日志的非官方 glog 库,他们分别是 g2log 和 g3log ,均采用 C++11 编写。 boost::log 支持 同步和异步 sink ,同步 sink 在将日志传递给 backend 时会加 斥锁 。 boost::log 的同步异步 sink 切换起来非常方便,只需要修改类型名就可以了。

       弄清原理,就是考察对待问题的态度,往往未知的未知才是问题的关键。

始终对未知心敬畏才是对待未知正常的态度,更是本应有的觉悟。

性能问题可能来源于任何地方,包括系统中因你一无所知而不曾检查的地方(为知的为知)。

你可能感兴趣的:(性能优化:弄懂goolg glog原理,提升程序性能)