經過strace 監控 Redis AOF文件的系統調用

經過strace 監控 Redis AOF文件的系統調用

Redis中主要的AOF設置

  • 「appendonly yes」 開啓每次更新操做後進行日誌記錄redis

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

  • 「 appendfsync everysec」 指定日誌更新的條件,有3個值可選緩存

    • no:表示等操做系統進行數據緩存同步到磁盤(快)安全

    • always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全)app

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

經過 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,將緩衝區中的數據寫到磁盤上。

相關文章
相關標籤/搜索