dd 測試sync、fsync和fdatasync參數詳解【轉】


轉自:https://www.xuebuyuan.com/2125675.html

dd 測試sync、fsync和fdatasync參數詳解

現在在做ceph性能方面的測試,使用dd命令測試集群的吞吐量,為了排除內存緩沖對實驗結果的影響,選擇創建二倍於內存的文件,命令如下:
dd if=/dev/zero of=/home/cloud/test/test.iso bs=1M count=409600 2>>/home/cloud/test/dd-16_rs.txt 
現在問題來了,我們服務器的內存是196G!創建測試文件的大小是400G,若創建文件的速度是30M/S,一個測試用例將會用將近4個小時,崩潰了~因此,詳細的看了一下dd命令相關參數,重點在創建文件時,繞過內存,直接寫入磁盤得到真實的ceph集群吞吐。man 了一下dd命令,看不懂。然后google了一下,下面是參考連接:http://systembash.com/content/simple-disk-benchmarking-in-linux-using-dd/
 ceph.com/docs/master/rados/operations/crush-map/  在這兩個連接中,在DD創建文件時都推薦使用conv=fdatasync 這個參數,又查了一下,一篇UC對ceph集群做的測試:http://tech.uc.cn/?p=1223,他們沒有使用 conv=fdatasync這個參數,而使用了另
一個參數:oflag=dsync。到底使用哪個呢?在本機測試了一下,如下:
dd if=/dev/zero of=test-geml-01.iso bs=1M count=5120 conv=fdatasync   84.9 MB/秒
dd if=/dev/zero of=test-geml-02.iso bs=1M count=5120 oflag=dsync      15.1 MB/秒
因為本機拷貝速度應該大於 15.1 MB/秒,感覺還是 conv=fdatasync這個參數靠譜一些。另附參數含義解釋:

在大多數的unix/linux對磁盤io的寫操作都是通過緩存來完成的,基本的原理如下:當將數據寫入文件時,內核通常先將該
數據復制到其中一個緩沖區中,如果該緩沖區尚未寫滿,則並不將其排入輸出隊列,而是等待其寫滿或者當內核需要重用
該緩沖區以便存放其他磁盤塊數據時,再將該緩沖排入輸出隊列,然后待其到達隊首時,才進行實際的I/O操作。 我們稱之
為延遲寫,極大的減少了寫磁盤的次數。

但是在沒寫特殊的應用中我們需要實時的將應用層數據寫入到磁盤上 特別是一些高可靠性要求的系統中 數據需要及時的寫入磁盤 即便是瞬時系統故障 數據也可以安全恢復,於是就有了sync、fsync和fdatasync函數。但在功能上 這三個函數又略
有區別:


     sync函數只是將所有修改過的塊緩沖區排入寫隊列,然后就返回,它並不等待實際寫磁盤操作結束。通常稱為update的
系統守護進程會周期性地(一般每隔30秒)調用sync函數。這就保證了定期沖洗內核的塊緩沖區。


    fsync函數只對由文件描述符filedes指定的單一文件起作用,並且等待寫磁盤操作結束,然后返回。fsync可用於數據庫這
樣的應用程序,這種應用程序需要確保將修改過的塊立即寫到磁盤上。


    fdatasync函數類似於fsync,但它只影響文件的數據部分。而除數據外,fsync還會同步更新文件的屬性。
參考:http://www.hostloc.com/thread-86657-1-1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM