2012-10-17 61 views
1

我試圖獲取扇區大小,特別是我可以正確調整用O_DIRECT讀/寫的緩衝區大小。在沒有原始文件系統權限的情況下獲取磁盤扇區大小

,當我的應用程序的root身份運行下面的代碼工作:

int fd = open("/dev/xvda1", O_RDONLY|O_NONBLOCK); 
size_t blockSize; 
int rc = ioctl(fd, BLKSSZGET, &blockSize); 

我怎樣才能得到它不被作爲root運行的扇區大小?

+0

您是否正在閱讀(使用'O_DIRECT')原始分區或其中的文件系統上的某個文件? –

+0

你爲什麼問?你正在尋求最佳的IO性能,還是由於其他原因? –

+0

@BasileStarynkevitch我正在讀取和寫入文件,並使用O_DIRECT進行性能測試,因爲我只是讀取或寫入隨機定位的512字節塊。 – Max

回答

1

根據Linux聯機幫助頁的open():

在Linux中的對齊限制由文件系統和內核版本有所不同,可能會完全消失。但是,目前沒有文件系統無關的接口,用於應用程序發現給定文件或文件系統的這些限制。一些文件系統爲它們提供了自己的接口,例如xfsctl(3)中的XFS_IOC_DIOINFO操作。

所以它看起來像你可能能夠使用xfsctl()獲取這些信息......如果你使用的是xfs。

由於您的基礎塊設備是一個Xen虛擬塊設備,並且可能有任何數量的層(LVM,dm-crypt,另一個文件系統等)......我不確定這一切有多麼有意義將真的爲你。

0

您可以使用stat(2)和相關係統調用(可能在某個特定文件上),然後使用st_blksize字段。但是,這會產生與文件系統相關的塊大小,而不是硬件所偏好的扇區大小。但是對於O_DIRECT輸入(來自文件系統上的文件!)st_blocksize可能更相關。否則,我會建議您的讀取大小(您可能希望將讀取緩衝區與頁面大小對齊,通常爲4K字節)的大小爲8KB或64KB,這可能是8KB或64KB。

相關問題