通过strace 监控 Redis AOF文件的系统调用

Redis中主要的AOF设置

  • 「appendonly yes」 开启每次更新操作后进行日志记录

  • 「appendfilename appendonly.aof」 AOF的文件名

  • 「 appendfsync everysec」 指定日志更新的条件,有3个值可选

    • no:表示等操作系统进行数据缓存同步到磁盘(快)

    • always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)

    • everysec:表示每秒同步一次(默认值)

通过 strace 来监控系统调用

strace -p $(pidof redis-server) -T -e trace=fdatasync

命令行解释:

  • -p 进程id

  • pidof 根据进程名得到进程id

  • -T 相对时间

  • -e 过滤系统调用

「appendfsync always」情况

strace -p $(pidof redis-server) -T -tt -e 'fdatasync' 2>&1 | head -10

输出

Process 59868 attached
02:50:50.671717 fdatasync(13) = 0 <0.000985>
02:50:50.680681 fdatasync(13) = 0 <0.000894>
02:50:50.688486 fdatasync(13) = 0 <0.000490>
...
02:50:50.705096 fdatasync(13) = 0 <0.000466>
02:50:50.709080 fdatasync(13) = 0 <0.000475>
02:50:50.713067 fdatasync(13) = 0 <0.000470>

结论: 设置 appendfsync 为always 时,每次写操作都会调用一次fdatasync。这种情况数据最安全,但

由于每会执行fdatasync, 因此性能最差。

「appendfsync everysec」情况

当设置为appendfsync everysec 时,我在测试机上也执行同样的命令
strace -p $(pidof redis-server) -T -tt -e 'fdatasync' 2>&1 。 结果strace 死活
都无法输出「fdatasync」 。后来想到这个命令只是展示redis主线程里所有的fdatasync。不包括fork
出来的子进程的「fdatasync」。 所以当设置 「appendfsync everysec」时。strace 命令务必
加 「 -f 」选项

strace -p $(pidof redis-server) -f -T -tt -e fdatasync

输出结果

[pid 54973] 07:47:10.082237 fdatasync(6) = 0 <0.002964>
[pid 54973] 07:47:11.091494 fdatasync(6) = 0 <0.002958>
[pid 54973] 07:47:12.098606 fdatasync(6) = 0 <0.003093>
[pid 54973] 07:47:13.004418 fdatasync(6) = 0 <0.005337>
[pid 54973] 07:47:14.008431 fdatasync(6) = 0 <0.003520>
[pid 54973] 07:47:15.012835 fdatasync(6) = 0 <0.005906>
[pid 54973] 07:47:16.016416 fdatasync(6) = 0 <0.003066>
[pid 54973] 07:47:17.023678 fdatasync(6) = 0 <0.003277>
[pid 54973] 07:47:18.027549 fdatasync(6) = 0 <0.003180>

当 「appendfsync 为 everysec。redis会每秒进行一次fdatasync的系统调用。将缓冲区的数据写到磁盘。这一操作在大多数数据库系统中被称之为 「group commit」,就是组合多次写操作的数据,一次性将日志写入到磁盘。

「appendfsync no」情况

Redis不会主动调用fsync去将AOF日志内容同步到磁盘,所以这一切就完全依赖于操作系统的调试了。对大多数Linux操作系统,是每30秒进行一次fsync,将缓冲区中的数据写到磁盘上。

通过strace 监控 fdatasync的更多相关文章

  1. mysql strace fsync,fdatasync

    mysql> show create table y; +-------+------------------------------------------------------------ ...

  2. strace 监控所有php-fpm worker

    strace命令详解  http://linux.die.net/man/1/strace strace -tt -T $(pidof 'php-fpm: pool www' | sed 's/\([ ...

  3. Spring Boot引起的“堆外内存泄漏”排查及经验总结 strace

    小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...

  4. Linux后门权限维持手法

    0x01 Linux 1. 预加载型动态链接库后门 inux操作系统的动态链接库在加载过程中,动态链接器会先读取LD_PRELOAD环境变量和默认配置文件/etc/ld.so.preload,并将读取 ...

  5. Spring Boot引起的“堆外内存泄漏”排查及经验总结

    小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...

  6. 《Linux 性能及调优指南》2.3 监控工具

    翻译:飞哥 (http://hi.baidu.com/imlidapeng) 版权所有,尊重他人劳动成果,转载时请注明作者和原始出处及本声明. 原文名称:<Linux Performance a ...

  7. Android external扩展工程

    Android的扩展工程包含在external文件夹中,这是一些经过修改后适应Android系统的开源工程,这些工程有些在主机上运行,有些在目标机上运行: 工程名称  工程描述  aes  高级加密标 ...

  8. 一个Python开源项目-哈勃沙箱源码剖析(下)

    前言 在上一篇中,我们讲解了哈勃沙箱的技术点,详细分析了静态检测和动态检测的流程.本篇接着对动态检测的关键技术点进行分析,包括strace,sysdig,volatility.volatility的介 ...

  9. 【转载】Spring Boot引起的“堆外内存泄漏”排查及经验总结

    背景 为了更好地实现对项目的管理,我们将组内一个项目迁移到MDP框架(基于Spring Boot),随后我们就发现系统会频繁报出Swap区域使用量过高的异常.笔者被叫去帮忙查看原因,发现配置了4G堆内 ...

随机推荐

  1. 结缘PDO

    起因 一直没有注意看数据库相关知识 几个月之前,无意打开如下一段代码: 被人吐槽是N年前的写法.后来也是学习需要,单一mysql已经不合适了.于是上网搜了一下好方法,PDO迎面而来. 诱惑 上网浏览时 ...

  2. 关于Action中ValidateXXX方法校验一次失败后\导致以后一直返回input视图的情况

    问题:     使用struts2的validateXXX()进行验证,出错后自动返回之前的画面,但是Form中的数据全部丢失了,如何才能保存出错前的Form是要解决的问题. 调查:     调查后发 ...

  3. SCOI2015题解 && 考试小结

    Day1: 第一题:裸地二分+网络流:二分答案,连接将每行每列拆成点,对于满足答案的格子行列连边,看是否流量是否大于t即可,可惜第k大看成了第k小,然后100分就没了. 第二题:倍增,考虑贪心算法,就 ...

  4. Uva 1050 Ars Longa

    Description You have been struck with inspiration, and are designing a beautiful new art sculpture f ...

  5. Entity FrameWork知识点汇总

    这里罗列的并非EF的所有知识点 ,只是我在开发过程中遇到或者使用到的知识,记录于此, 备忘 1:EF的三种创建方式 A:Database First B:Model First C:Code Firs ...

  6. 关于ARP欺骗与MITM(中间人攻击)的一些笔记( 二 )

    一直没有折腾啥东西,直到最近kali Linux发布,才回想起应该更新博客了….. 再次说明,这些技术并不是本人原创的,而是以前记录在Evernote的旧内容(排版不是很好,请谅解),本文是继关于AR ...

  7. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  8. 【BZOJ 1010】 [HNOI2008]玩具装箱toy (斜率优化)

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9330  Solved: 3739 Descriptio ...

  9. perl use base 继承

    centos6.5:/root/podinns/lib#cat First.pm package First; use base qw(Second); sub new { my $self = {} ...

  10. dom4j中 selectSingleNode 或selectNodes获取不到节点的原因总结 (转)

    没想到搞个dom4j会出这么多怪错.. 最近在研究XBRL GL的有关内容,在项目中要求吧XBRL GL导入到11179注册库中,根据11179建立数据库,然后从XBRL GL分类标准中导入数据到数据 ...