write如何實現高速寫盤

2021-08-31 00:01:04 字數 2175 閱讀 6305

#define _gnu_source

#include #include #include #include #include #include #include #include #include #include #include #include #include #include //#define buf_size (128 * 1024 * 1024)

#define buf_size (128 * 1024 * 1024)

#define memcnt 1

int main(int argc, char* argv)

; unsigned char *p_buffer[memcnt];

size_t pagesize = getpagesize();

printf("pagesize=%d\n", pagesize);

for( i = 0 ; i < memcnt ; i++ )

} sprintf(filename, "/data/%02d", ntimes);

printf("***************==== test write file : %s ***************====\n", filename);

fd = open(filename, o_wronly|o_creat|o_direct|o_largefile, 0755);

//fd = open(filename, o_wronly|o_creat|o_direct, 0755);

if (fd < 0)

for(j =0;j= (1024*1024*1024/buf_size) )

printf("alltime = %lf ms, daikuan = %lf m/s write1gcnt = %dg speedval = %lfmb\n", alltime, speed , write1gcnt , speedval);

cnt = 0;

alltime = 0;

} }close(fd);

free(p_buffer);

return 0;

}

需要使用以下的方式提高頻寬

1.呼叫posix_memalign()函式申請連續的記憶體空間

int posix_memalign (void **memptr,

size_t alignment,

size_t size);

posix_memalign()函式和malloc這類函式的區別是它申請的記憶體為連續的。呼叫posix_memalign( )成功時會返回size位元組的動態記憶體,並且這塊記憶體的位址是alignment的倍數。引數alignment必須是2的冪,還是void指標的大小的倍數。返回的記憶體塊的位址放在了memptr裡面,函式返回值是0.

呼叫失敗時,沒有記憶體會被分配,memptr的值沒有被定義,返回如下錯誤碼之一:

einval

引數不是2的冪,或者不是void指標的倍數。

enomem

沒有足夠的記憶體去滿足函式的請求。

要注意的是,對於這個函式,errno不會被設定,只能通過返回值得到。

2.使用getpagesize函式獲得一頁記憶體大小並以此大小為單位申請記憶體

系統給我們提供真正的記憶體時,用頁為單位提供,一次最少提供一頁的真實記憶體空間

分配記憶體空間:你真實的分配了多少記憶體,就使用多少記憶體,不要越界使用

但是系統提供的真實記憶體空間是以頁來提供的。

3.weite的o_direct和o_largefile引數

呼叫write時加上這兩個引數,並使用較大的粒度寫盤,如64m,128m,以提高頻寬,總的來說,一半粒度越大,頻寬越高。你可以根據自己的專案需求實際測試一下多大的粒度可以滿足條件

最後使用dd指令dd if=/dev/zero of=/data/file.file bs=1m count=10000 oflag=direct實測ssd頻寬接近600m/s左右,使用iometer軟體實測寫盤頻寬800m/s左右,使用我們的函式測128m的粒度前150g可達到700m/s。前1t可達到400m/s,超過1t頻寬接近400m/s。

這個速度是我們ssd的速度,各位還需根據自己的ssd實際測試。

mysql高速寫資料 Tempdb資料庫詳細介紹

一 tempdb簡介 tempdb是sqlserver的系統資料庫一直都是sqlserver的重要組成部分,用來儲存臨時物件。可以簡單理解tempdb是sqlserver的速寫板。應用程式與資料庫都可以使用tempdb作為臨時的資料儲存區。乙個例項的所有使用者都共享乙個tempdb。很明顯,這樣的設...

mysql高速寫資料庫 Tempdb資料庫詳細介紹

一 tempdb簡介 tempdb是sqlserver的系統資料庫一直都是sqlserver的重要組成部分,用來儲存臨時物件。可以簡單理解tempdb是sqlserver的速寫板。應用程式與資料庫都可以使用tempdb作為臨時的資料儲存區。乙個例項的所有使用者都共享乙個tempdb。很明顯,這樣的設...

Linux VFS中write系統呼叫實現原理

目錄 使用者空間的 write 函式在核心裡面的服務例程為 sys write.1 vfs write 函式實現原理 2 word裡面的目錄複製過來似乎不能直接用。還是放在這裡當主線看吧.使用者空間的 write 函式在核心裡面的服務例程為 sys write root syslab grep wr...