/ dev / zero에서 읽은 값이 IO_RBYTES로 계산되지 않는 이유는 무엇입니까?


25

이 명령을 사용하여 일부 Linux 4.x OS에서 하드 드라이브를 비 웁니다.

sudo sh -c 'pv -pterb /dev/zero > /dev/sda'

그리고 나는 또 다른 tty를 열고 시작 sudo htop하고 이것을 알아 차렸다.

  PID USER      PRI  NI CPU%   RES   SHR   IO_RBYTES   IO_WBYTES S   TIME+  Command
 4598 root       20   0 15.5  1820  1596        4096    17223823 D  1:14.11 pv -pterb /dev/zero

에 대한 값은 IO_WBYTES정상적인 것으로 보이지만 IO_RBYTES4KiB로 유지되며 변경되지 않습니다.

예를 들어 몇 가지 다른 프로그램을 실행했습니다.

dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero

그리고 그들 중 누구도 많이 발생하지보고 놀랐습니다 IO_RBYTES나 IO_WBYTES.

나는 이것이 어떤 프로그램에만 국한되지는 않지만 I / O 바이트 /dev/zero로 /dev/{zero,null}계산 하기 위해 읽고 쓰지 않는 이유는 무엇입니까?


5
궁금합니다. 왜 I / O로 계산 해야 한다고 생각 하십니까?
— marcelm

1
@marcelm 필자는 파일 R / W, 네트워크 I / O 등을 포함한 모든 입력 / 출력이 I / O로 계산되어야한다고 생각합니다.
— iBug

그러나 이러한 작업은 하드웨어 (디스크 및 네트워크 카드)에 대한 I / O를 수행하고 일부 I / O 버스 (예 : PCI-express)를 통해 이동해야합니다.이 모두는 심각한 병목 현상이 될 수 있습니다. 예를 들어, /dev/null하드웨어와의 인터페이스를 끝내지 않고 I / O 버스를 막지 마십시오. 극단적으로 찍은; 메모리에 대한 읽기 / 쓰기도 I / O입니까? 물론, 이것들에 대한 명확한 묘사는 없으며, 그것은 당신이 어떤 관점에서이 관점을 취하는 지, 그리고 관점이 당신에게 얼마나 유용한 지에 달려 있습니다.
— marcelm

1
저의 첫 번째 의견은 그러한 관점에 대해 생각하고 당신의 관점을 취하는 이유를 찾기 위해 당신과 다른 사람들을 자극하기위한 것입니다. 당신이 틀렸다는 것을 암시하는 것은 아닙니다. 나는 상황이 그 흑백이라고 생각하지 않습니다. 그러나 개인적으로 실제 하드웨어 (병목 현상이있을 수 있음)에 대한 I / O 통계 (병목 현상이 아닌 병목 현상)에 훨씬 더 관심이 있습니다 /dev/{null,zero}. 그건 그냥 내 관점 : 비록입니다
— marcelm

1
@marcelm는하지만 처음에 생각되었다는 read(2)과 write(2)자신의 의미에서 매우 합리적인 I / O,로 계산됩니다.
— iBug

답변:


54

I / O로 계산되지만보고있는 필드에 의해 측정 된 유형은 아닙니다.

에서는 htop, IO_RBYTES및 IO_WBYTES쇼 read_bytes와 write_bytes의 필드를 /proc/<pid>/io, 그 필드는 블록 층을 통과 바이트를 측정한다. /dev/zero블록 레이어를 포함하지 않으므로 읽기는 표시되지 않습니다.

에서 I / O를 참조하십시오 /dev/zero당신이 볼 필요가, rchar그리고 wchar필드 /proc/<pid>/io에 표시, htop같은 RCHAR과 WCHAR:

rchar : 문자 읽기

스토리지에서이 태스크를 읽은 바이트 수입니다. 이것은 단순히이 프로세스가 전달한 바이트 read(2)와 유사한 시스템 호출 의 합계입니다 . 여기에는 터미널 I / O와 같은 것이 포함되며 실제 물리 디스크 I / O가 필요한지 여부에 영향을받지 않습니다 (읽기가 pagecache에서 만족되었을 수 있음).

wchar : 문자 쓰기

이 작업으로 인해 발생했거나 디스크에 기록되는 바이트 수입니다. rchar와 비슷한 경고가 여기에 적용됩니다.

참조 man 5 proc및 man 1 htop자세한 내용은.


그것은 그래서 rchar및 wchar그 수는 호출에서 바이트 read(2)하고 write(2), 맞죠?
— iBug

네 맞습니다.
— Stephen Kitt

9
rchar 에 대한 설명에서 잘못된 표현에 대해 이야기하십시오 . read()가장 많이 통과 한 모든 것이 " 저장소 에서 읽지"않습니다 !
— ilkkachu

2
@ilkkachu storage는 문제의 스토리지가 물리적 또는 가상 또는 mmap'd 또는 가상 소켓 또는 L1 캐시인지 여부에 관계없이 "생각 가능한 모든 버스 라인"을 의미합니다. 공유
— 고양이를
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.