/ 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_RBYTESIO_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_RBYTESIO_WBYTESread_byteswrite_bytes의 필드를 /proc/<pid>/io, 그 필드는 블록 층을 통과 바이트를 측정한다. /dev/zero블록 레이어를 포함하지 않으므로 읽기는 표시되지 않습니다.

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

rchar : 문자 읽기

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

wchar : 문자 쓰기

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

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


그것은 그래서 rcharwchar그 수는 호출에서 바이트 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.