Windows 데스크탑은 1GB 이더넷 케이블을 통해 Ubuntu가 설치된 개인 NAS(개발 중)에 연결됩니다. strace는 Samba가 어려운 작업을 수행하는 동안 NAS에서 파일(>1GB 크기)을 읽고 쓰는 동안 Samba 프로세스의 시스템 호출을 모니터링하는 데 사용됩니다.
다음은 strace 출력의 일부입니다.
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000075>
pread(31, "\255\343.\372e\357F\315\357\247\21o{\331\223\336\216\235\367\\#L\312\220W\323\226\303\302\21\35\336"..., 1048576, 13631488) = 1048576 <0.010848>
writev(34, [{"\3261\347S\205\2\347\325\316\325\214LT{\337\256!\351\246\266\342b\204i\347\221:x$\r\5\227"..., 999020}], 1) = 49640 <0.000451>
gettimeofday({6146, 475882}, NULL) = 0 <0.000282>
gettimeofday({6146, 476842}, NULL) = 0 <0.000152>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 57236) = 1 ([{fd=34, revents=POLLOUT}]) <0.000202>
이 작업은 읽은 모든 바이트가 캐시에 기록될 때까지 계속되며 그 이후에는 새로운 pread
시스템 호출이 이어집니다. ( mmap2
-ed 메모리가 매핑 해제되기 전)
나는 나중에 호출된 함수가 writev
점점 더 많은 수의 바이트를 반환한다는 것을 알았습니다.
mmap2(NULL, 1052672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb4eaf000 <0.000304>
pread(31, "\343\367\235\227Q;\3717\240<\nl\326ff\0\361 J\37\253T\247\352\207\376\372\273\341\360\370y"..., 1048576, 458227712) = 1048576 <0.032897>
writev(34, [{"\t\21\6\301\366hPq\274\373\353x\332X\377\310\275<J\4z\261\0\227\24\230\256\350\300\16\355\203"..., 674900}], 1) = 373760 <0.002618>
gettimeofday({6164, 906348}, NULL) = 0 <0.000149>
gettimeofday({6164, 907318}, NULL) = 0 <0.000149>
poll([{fd=10, events=POLLIN|POLLHUP}, {fd=6, events=POLLIN|POLLHUP}, {fd=8, events=POLLIN|POLLHUP}, {fd=34, events=POLLIN|POLLOUT|POLLHUP}], 4, 38805) = 1 ([{fd=34, revents=POLLOUT}]) <0.000199>
- 왜 이런 일이 발생합니까? I/O 스케줄러에 따라 달라지나요? 사용되는 I/O 스케줄러는 ROW입니다.
어떤 방식으로든 읽기 및 쓰기 I/O에 영향을 미칠 수 있나요?블록 크기? 속도를 높이고 싶었는데 큰 것부터 시작해 보는 건 어떨까요?
writev
블록 크기처음부터. 만약에블록 크기pread
함수 반환 값의 올바른 이름입니다writev
. 분명히 있기 때문에 용어를 구별하기가 어렵습니다.블록 크기파일뿐만 아니라블록 크기디스크용.dd
예를 들어 다음을 사용할 때 매개변수를 통해bs
파일에 영향을 줍 니까?블록 크기? 자체 할인블록 크기포맷 시간에 따라 결정되며 즉시 변경할 수 없습니다.gettimeofday
마지막으로 함수 호출이 필요하지 않다고 생각해서 어떻게든 막을 수 있나요 , 아니면 제가 틀렸나요?
질문 중 일부가 제 지식의 심각한 부족을 드러낸다면 죄송합니다. 하지만 저는 정말로 모든 전문 용어를 정리하고 Linux 세계에 입문하기 위해 노력하고 있습니다.