關於 fio 和 etcd 的小故事
集群性能
fio --rw=write --ioengine=sync --fdatasync=1 --directory=test-data --size=22m --bs=2300 --name=mytest
您只需要查看結果並檢查持續時間的第 99 個百分位數
sync (usec): min=534, max=15766, avg=1273.08, stdev=1084.70
sync percentiles (usec):
| 1.00th=[ 553], 5.00th=[ 578], 10.00th=[ 594], 20.00th=[ 627],
| 30.00th=[ 709], 40.00th=[ 750], 50.00th=[ 783], 60.00th=[ 1549],
| 70.00th=[ 1729], 80.00th=[ 1991], 90.00th=[ 2180], 95.00th=[ 2278],
| 99.00th=[ 2376], 99.50th=[ 9634], 99.90th=[15795], 99.95th=[15795],
| 99.99th=[15795]
筆記
- 我們為我們的特定場景定制了 --size 和 --bs 選項。 要從 fio 獲得有用的結果,請提供您自己的值。 從哪裡得到它們? 讀
我們是如何學會配置 fio 的 . - 測試期間,所有 I/O 負載均來自 fio。 在現實場景中,除了與 wal_fsync_duration_seconds 相關的請求外,可能還會有其他寫入請求進入存儲。 額外的負載會增加 wal_fsync_duration_seconds 的值。 因此,如果第 99 個百分位數接近 10 毫秒,則表明您的存儲速度快用完了。
- 拿版本
FIO 不低於3.5 (以前的不顯示 fdatasync 持續時間百分位數)。 - 以上只是 fio 的一小部分結果。
關於 fio 和 etcd 的長篇大論
etcd中的WAL是什麼
通常數據庫使用
當客戶端將鍵添加到鍵值存儲或更新現有鍵的值時,etcd 將操作記錄在 WAL 中,WAL 是持久存儲中的常規文件。 etcd 必須完全確定 WAL 條目在繼續處理之前確實發生了。 在 Linux 上,一個系統調用是不夠的。
21:23:09.894875 lseek(8, 0, SEEK_CUR) = 12808 <0.000012>
21:23:09.894911 write(8, ". 20210220361223255266632$10 20103026"34"rn3fo"..., 2296) = 2296 <0.000130>
21:23:09.895041 fdatasync(8) = 0 <0.008314>
不幸的是,寫入持久存儲不會立即發生。 如果 fdatasync 調用很慢,etcd 系統的性能將受到影響。
使用 fio 估算存儲空間
如果您需要評估您的存儲是否適合 etcd,請使用非常流行的 I/O 負載測試工具 fio。 應該記住,磁盤操作可能非常不同:同步和異步、許多類系統調用等。因此,fio 很難使用。 它有很多參數,它們的值的不同組合會產生非常不同的 I/O 工作負載。 為了獲得足夠的 etcd 數據,您應該確保在寫入 WAL 文件時來自 fio 的測試寫入負載盡可能接近來自 etcd 的實際負載。
因此,fio 至少應該以一系列連續寫入文件的形式創建一個負載,每次寫入都將包含一個系統調用
為什麼是 fio 以及我們如何學會設置它
在這篇文章中,我們描述了一個真實的案例。 我們有一個集群
但是為此,必須解決兩個問題。 首先,etcd 在寫入 WAL 時創建的 I/O 負載是什麼樣的? 使用了哪些系統調用? 記錄的大小是多少? 其次,如果我們回答這些問題,我們如何用 fio 重現類似的工作負載? 不要忘記 fio 是一個非常靈活的工具,有很多選項。 我們用一種方法解決了這兩個問題——使用命令
當集群沒有負載時,我們首先使用 strace 探索 Kubernetes 的 etcd 服務器。 我們看到幾乎所有 WAL 記錄的大小都差不多:2200-2400 字節。 因此,在帖子開頭的命令中,我們指定了參數 -bs=2300(bs 表示每個 fio 條目的字節大小)。 請注意,etcd 條目的大小取決於 etcd 版本、分佈、參數值等,並影響 fdatasync 持續時間。 如果您有類似的情況,請使用 strace 檢查您的 etcd 進程以找出確切的數字。
然後,為了更好地了解 etcd 文件系統在做什麼,我們使用 strace 和 -ffttT 選項啟動它。 因此,我們嘗試檢查子進程並將每個子進程的輸出記錄在單獨的文件中,並獲得有關每個系統調用的開始和持續時間的詳細報告。 我們使用 lsof 來確認我們對 strace 輸出的分析,並查看哪個文件描述符被用於哪個目的。 於是在strace的幫助下,得到瞭如上圖所示的結果。 同步時間統計確認來自 etcd 的 wal_fsync_duration_seconds 與使用 WAL 文件描述符的 fdatasync 調用一致。
我們瀏覽了 fio 的文檔並為我們的腳本選擇了選項,以便 fio 生成類似於 etcd 的負載。 我們還通過從 strace 運行 fio 來檢查系統調用及其持續時間,類似於 etcd。
我們仔細選擇了 --size 參數的值來表示來自 fio 的整個 I/O 負載。 在我們的例子中,這是寫入存儲的總字節數。 事實證明它與寫入(和 fdatasync)系統調用的數量成正比。 對於一定的bs值,fdatasync的調用次數=size/bs。 由於我們對百分位數感興趣,因此我們必須有足夠的樣本才能確定,並且我們計算出 10^4 對我們來說就足夠了(即 22 兆字節)。 如果 --size 較小,則可能會出現異常值(例如,幾次 fdatasync 調用花費的時間比平時長,並且會影響第 99 個百分位)。
自己嘗試一下
我們向您展示瞭如何使用 fio 並查看存儲速度是否足以讓 etcd 正常運行。 現在您可以自己嘗試使用,例如,帶有 SSD 存儲的虛擬機
來源: www.habr.com