為了提升磁碟讀寫效能,Linux 核心採用「寫回快取」機制:資料先寫入記憶體緩衝區,再由核心排程器定期或被動刷入實體磁碟。sync 指令即是強制觸發這個刷寫動作,確保快取資料持久化。本文深入解析緩衝區機制、sync 運作原理、自動刷寫時機與實務應用場景。
| 機制 | 目的 | 資料流向 |
|---|---|---|
| Buffer (緩衝區) | 解決寫入效能 | 應用程式 → 記憶體 Buffer → 磁碟 |
| Cache (頁面快取) | 解決讀取效能 | 磁碟 → 記憶體 Cache → 應用程式 |
當程式呼叫 write(),資料實際上寫入 Page Cache(屬於 Cache 範疇),標記為「髒頁」,並非立即寫入磁碟。此時若發生斷電、核心恐慌或硬體故障,尚未刷寫的髒頁資料將遺失。
sync
sync(2),觸發核心將所有檔案系統的髒頁排入寫入佇列並等待完成。fsync(2)/fdatasync(2) 則針對單一檔案描述符。Linux 核心有兩條主要路徑自動將髒頁刷入磁碟:
/proc/sys/vm/dirty_writeback_centisecs(預設 500 = 5 秒)週期喚醒,將超過 dirty_expire_centisecs(預設 3000 = 30 秒)的髒頁寫回。dirty_background_ratio(預設 10%)啟動背景回寫;超過 dirty_ratio(預設 20%)強制同步阻塞寫入程序。可透過 sysctl -a | grep dirty 檢視與調整參數。
systemctl poweroff/reboot 內建同步流程,一般使用者無需手動執行 sync。
sync
umount /mnt/usb
# 或
udisksctl power-off -b /dev/sdX
拔除 USB 隨身碟/行動硬碟前務必執行,避免資料損毀。
sync
# 確保所有交易日誌、WAL、資料頁面落盤
cp /var/lib/mysql/ibdata1 /backup/
qemu-img convert -O qcow2 vm.raw vm.qcow2
測試新檔案系統或核心模組時,頻繁 sync 觀察資料一致性。
echo "$(date) Backup started" >> /var/log/backup.log
sync # 確保關鍵日誌不會因後續崩潰而遺失
| 指令 | 範圍 | 阻塞行為 | 典型用途 |
|---|---|---|---|
sync | 全系統所有檔案系統 | 等待所有髒頁寫入完成 | 安全移除、備份前 |
fsync(fd) | 單一檔案描述符 | 等待該檔案髒頁+中繼資料寫入 | 資料庫、關鍵檔案 |
fdatasync(fd) | 單一檔案描述符 | 僅等資料寫入(不含中繼資料) | 高效能資料寫入 |
sync_file_range() | 檔案指定範圍 | 非阻塞啟動回寫 | 大型檔案流式處理 |
sync 是 Linux 管理員確保資料持久化的基礎工具。理解「寫回快取」、髒頁回寫機制與自動觸發條件,才能在正確時機(外接裝置移除、備份前、關鍵日誌)使用它,而非盲目頻繁呼叫。生產環境應依賴核心自動機制,輔以 fsync 於應用層關鍵路徑,實現效能與資料安全的平衡。
Linux alias 指令別名設定:顯示/建立/移除、寫入啟動檔永久生效、限定用戶權限
Linux 桌面環境 HiDPI 縮放完整設定指南:GNOME、KDE、XFCE、Cinnamon、Firefox
Linux 掛載 Windows 共享資料夾完整圖文教學 (VMware 環境實測)
Ubuntu 忘記使用者密碼?進入單人模式重設 Root 密碼完整圖文教學
CentOS 7/8 開放 80/443 埠口:firewalld 與 iptables 雙模式配置指南
Fedora 18 DNSenum IP 顯示亂碼修正:Perl 腳本 $rr->{address} 改為 $rr->address