聊城网站推广,阿里巴巴做网站吗,wordpress的坏处,西安计算机培训机构哪个最好nonolog起步笔记-1 背景与上下文写在前面Nanolog与一般的实时log的异同现代log的一般特性Nanolog的选择 背景与上下文
因为工作中用到了NanoLog。有必要研究一下。 前段时间研究了许多内容#xff0c;以为写了比较详实的笔记#xff0c;今天找了找#xff0c;不仅笔记没找到… nonolog起步笔记-1 背景与上下文写在前面Nanolog与一般的实时log的异同现代log的一般特性Nanolog的选择 背景与上下文
因为工作中用到了NanoLog。有必要研究一下。 前段时间研究了许多内容以为写了比较详实的笔记今天找了找不仅笔记没找到本来做那的测试工程也被删除得一干二净。 痛定思痛记录一下。
写在前面
学习一种新的技术最好的办法是先不要看先要思考自己的需求如果自己来实现应当如何做。最好写在纸上。 然后再找现成的轮子。这时不要被这些轮子影响。
Nanolog与一般的实时log的异同
现代log的一般特性
一般的实时log都是由几个元素构成 1。 分为client和server。 这样做的目的是为了做到客户端导步工作数据放下就扭头就走。不需要客户端自己操作耗时的circle锁和IO。 server则独占一个core完成后半段的工作。从buffer取出数据存入到硬盘中。 这里对于sever端已有许多选择例如不写入磁盘而是维护一个固定大的内存区块。 甚至将这个内存建在非分页内存上以便于程序crash后甚至OS重启后数据仍然能够获得。 。 分为多个client共用一个circlebuffer还是每client用一个自己私有buffer. 各有利弊。 如果共用一个cirlce buffer那么内存总占用量不因client增加而增加。这种情况可以将client与线程甚至是线程更小的粒度绑定。 但这种缺点是极为明显的随clent的增加等待circle buffer写锁的时间越来越长。不得不将部分log丢弃。 。 对任何一个log你都必须设计丢弃的机制这点极为重要因为任何一个主动对象都是系统的一个成员系统第一要务不是完成产品需求和用户的需求而是自己的生存系统一定要保证不能被日志累跨。 。 现代的log一般都是将client绑在core上每个core利用目前现代CPU支持的原子操作忙等待完成写入而且写入的是自己的私有的buffer私有的buffer为什么还要加原子锁的原因是因为OS可能将当前线程调往另一个核执行。但如果采用了亲和性和核隔离那么原子锁也不需要。 。 全面二进制化。消除任何对字符串操作的消耗。
Nanolog的选择
。 Nanolo的server端是独立线程采用了异步io所以看起来是两个线程。这个设计并一定是很理想事实上并不理想。如果你想实现全memory log则需要自己处理一下。 而且异步io并不是可控的是OS自动完成的。 。 client似乎是以每thread为单位实际是进程而不是以core为最小粒度。比如perflttng等它们是以核为单位。 以线程为单位有好处但缺点是占用内存较多。以及随着线程增加server轮循每线程私有buffer获取数据的负但也在增加日志丢失的可能性多了一项由于sever忙于处理同类的buffer而可以导致某个线程的log丢失的概率不再可控。 3。二进制化。这也是现代微秒级以下log必须要做的。 nanolog在这方面做了许多相对超前和创新的工作。 一般而言只要二进制化只能是完全自定义的例如CTF以前工在flexran上Intel的MLog等等。 但Nanolog在这方面的尝试是相当值得肯定的直接将printf二进制化。 这个许多人的文章写了一些后面我也会详细讲解。 现在我们可以简单说一下google的开发者在没有C17之前是采用事先预处理方式来实现了在C17之后完全采用compiling time来实现该功能。