前言
fwrite到用户缓冲区再write再到内核,相比write直接写入内核肯定是多了一个缓冲区。需要特别注意的是,每次写入数据短<1024时候,fwrite效率更高。每次写的数据多,比如2900,write的效率更高,因为fwrite需要二次拷贝。
一、日志写入逻辑
log4cpp既拥有c语言风格printf()的日志输出格式,也有c++语言cout<<这种输出格式。
可以分模块打印不同的日志文件。也可以把所有模块的日志也打印同一个文件。
一秒钟打印10000条日志,那肯定是不行的,会影响服务器性能。好的日志,一秒钟能达到百万级别。
同步日志方式,只适合用在客户端。
异步日志方式,适合在服务器。
检查文件大小,导致日志库性能大幅度下降。二、Log4cpp日志框架
实时写入磁盘 单笔write
多行日记累计再写入,累计了就差一行却一直得不到消息。
单独启动一个定时器,1秒去刷新一次。三、log4cpp范例讲解
四、muduo日志库分析
1、性能分析
双缓冲机制
日志notify问题,写满一个buffer才一次notify通过wait_timeout去读取日志,然后写入磁盘2、日志批量写入
3、批量唤醒写线程
4.写日志用notify+wait_timeout方式触发日志的写入
5、锁的粒度,双缓冲,双队列
双缓冲机制:
1、日志notify问题
(1)写满一个buffer才一次notify插入日志,日志apt调用线程
(2)通过notifywait_timeout去读取日志,然后写入磁盘 日志落盘线程2、能够避免buffer不断分配
3、buffer默认4M一个
那就写满4M才notify一次6、buffer默认4M缓冲区,buffer队列,push、pop时使用mov语义减少内存拷贝
通过源码不难看出,当落盘线程跟不上生产日志线程会new一个新的缓冲队列。
把buffer里面的buffer转移道buffersToWrite 把里面的数据全部落盘。总结
今天通过Darren老师的讲述,让我对日志库有了初步的了解。因为自己工作中正好需要日志库,所以利用业余时间调研了glog,booslog,log4cpp等等,听了darren老师的课如获至宝。以前认为日志库一秒钟写几千条就已经很了不起了,而Darren老师表示日志一秒钟记个几百万条才是正常的日志库,让我瞬间认清了自己与大佬之前的差距。希望未来能虚心学习,不断磨练意志,早日若离苦海。
推荐一个 c/c++Linux后台服务器开发的经典教程给大家,个人觉得讲的不错,有兴趣的可以学习下。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END