#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,posix_memalign()函式和malloc這類函式的區別是它申請的記憶體為連續的。呼叫posix_memalign( )成功時會返回size位元組的動態記憶體,並且這塊記憶體的位址是alignment的倍數。引數alignment必須是2的冪,還是void指標的大小的倍數。返回的記憶體塊的位址放在了memptr裡面,函式返回值是0.size_t alignment,
size_t size);
呼叫失敗時,沒有記憶體會被分配,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...