zoukankan      html  css  js  c++  java
  • 通过strace 监控 fdatasync

    通过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,将缓冲区中的数据写到磁盘上。

  • 相关阅读:
    day10 基本数据类型(下)
    day09 作业
    day09 基本数据类型(中)
    day08 作业
    day8 for循环+基本数据类型(上)
    Python正课109 —— 前端 进阶8
    Python正课108 —— 前端 进阶7
    Python正课107 —— 前端 进阶6
    Python正课106 —— 前端 进阶 5
    Python正课105 —— 前端 进阶4
  • 原文地址:https://www.cnblogs.com/zengkefu/p/5634742.html
Copyright © 2011-2022 走看看