「appendonly yes」 開啓每次更新操做後進行日誌記錄redis
「appendfilename appendonly.aof」 AOF的文件名數據庫
「 appendfsync everysec」 指定日誌更新的條件,有3個值可選緩存
no:表示等操做系統進行數據緩存同步到磁盤(快)安全
always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全)app
everysec:表示每秒同步一次(默認值)async
strace -p $(pidof redis-server) -T -e trace=fdatasync
命令行解釋:性能
-p 進程id測試
pidof 根據進程名獲得進程id操作系統
-T 相對時間命令行
-e 過濾系統調用
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 時,我在測試機上也執行一樣的命令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」,就是組合屢次寫操做的數據,一次性將日誌寫入到磁盤。
Redis不會主動調用fsync去將AOF日誌內容同步到磁盤,因此這一切就徹底依賴於操做系統的調試了。對大多數Linux操做系統,是每30秒進行一次fsync,將緩衝區中的數據寫到磁盤上。