2012-05-08 2 views
3

큰 SCSI 쓰기를 생성하는 사용자 공간 응용 프로그램이 있습니다 (아래 세부 정보). 그러나 SCSI 대상 (예 : FC로 연결된 저장소)에 도달하는 SCSI 명령을 살펴보면 이러한 쓰기를 512K 청크로 분할하고 있습니다.Linux : 쓰기가 512K 청크로 분할됩니다.

적용은 기본적으로 직접 장치에 1M 크기의 직접 기입을 수행

fd = open("/dev/sdab", ..|O_DIRECT); 
write(fd, ..., 1024 * 1024); 

이 코드는 SCSI, 512K 각각 전송 될 두 기입시킨다.

그러나 블록 계층없이 직접 SCSI 명령을 실행하면 쓰기가 분할되지 않습니다. 나는 명령 줄에서 다음 명령을 실행

sg_dd bs=1M count=1 blk_sgio=1 if=/dev/urandom of=/dev/sdab oflag=direct 

나는 하나의 1M 크기의 SCSI의 WRITE를 볼 수 있습니다.

질문은 무엇이 분할 쓰기이고, 더 중요한 것은 구성 가능합니까?리눅스 블록 레이어는 SG_IO가 통과하지 못하기 때문에 죄책감을 느낍니다. 512K는 설정 가능한 매개 변수가 아닌 숫자로 보입니다.

답변

1

실제로 블로미는 블록 계층에 있으며, SCSI 계층 자체는 크기를 거의 고려하지 않습니다. 직접적인 레이어는 많은 작은 페이지로 나뉘어지기 때문에 하드웨어 나 하드웨어가 지원할 수있는 것보다 더 긴 스 캐터 - 수집 목록을 필요로하기 때문에 직접적인 레이어는 실제로 요청을 통과 할 수 있는지 확인해야합니다. 심지어 운전자 (libata는/다소 제한적이었습니다).

/sys/class/block/$ DEV/queue 거기에 여러 파일이 있으며 max_sectors_kb 만 필요할 수도 있지만 가장 적합한 파일은 max_sectors_kb입니다. 또한 파티션 변수를 조정해야 할 수도 있습니다.

0

다음 파일을 보면 논리적 블록 크기가 다른지, 아마도 512 가지가 있는지 여부를 알 수 있습니다. 나는이 값들을 변경하기 위해이 파일들에 쓸 수 있는지 확신 할 수 없다. (논리 블록 크기는)

/sys/block/<disk>/queue/physical_block_size 
/sys/block/<disk>/queue/logical_block_size 
+0

아니, 블록 크기는 관련이없는 -가 512에 데이터를 분할 - ** 킬로 **하지 바이트 덩어리, 512 바이트 것. – Leonid99

0

블록 드라이버의 요청 당 최대 섹터 속성이 있습니다. 나는 그것을 수정하는 방법을 확인해야 할 것입니다. 당신은 blockdev --getmaxsect를 통해이 값을 얻을 수 있었지만, 내 컴퓨터의 blockdev에서 --getmaxsect 옵션을 보지 못했습니다.

0

시도 ioctl을 (FD, BLKSECTSET, & 블록)

관련 문제