이 문제에 대한 나의 관점은 개발자의 관점입니다. 내가 작성한 코드는 엔터프라이즈 시스템의 여러 가상 머신 중 하나로 실행되는 RHEL 가상 머신에 배치되었습니다. 사용된 파일 시스템은 원격 네트워크 연결 저장 장치입니다.
일괄 처리 중에 간단한 명령에는 많은 가변성이 있습니다. 그래서 우리는 더 많은 정보를 얻기 위해 테스트를 준비했지만 지금은 우리가 무엇을 발견했는지 모르겠습니다.
30분마다 다음 명령을 실행하고 출력을 기록합니다. 6GB 파일의 복사본입니다. 시스템이 많은 작업을 실행 중이고 이 테스트 명령에 대한 CPU 시간이 낮을 때 실행 시간이 11초에서 190초로 점프하는 것을 보았습니다.
CPU가 낮을 때는 "I" 열(파일 시스템 입력)이 채워지고 CPU가 높을 때는 채워지지 않는 것을 볼 수 있습니다. "w" 열(비자발적 교환)도 훨씬 더 높습니다.
내 질문은 CPU 시간이 감소하여 너무 오랫동안 실행되도록 하면 이 작업/명령에 어떤 일이 발생하는가입니다. 스왑 인/스왑 아웃을 하면 훨씬 느린 다른 장치에 모든 데이터가 저장됩니까? 일반적으로 스왑 인/아웃 중에는 어떤 일이 발생합니까?
실행 명령:
/usr/bin/time -a -o filename.txt cp file.txt fileCopy.txt
날짜 | 시간 | 이자형 | 에스 | 유 | 인 | 씨 | 승 | 나 | 산소 |
---|---|---|---|---|---|---|---|---|---|
2022년 3월 14일 | 5:19:02 | 64.9 | 16.23 | 1.03 | 26% | 3005 | 29210 | 12000016 | 12000000 |
2022년 3월 14일 | 5:49:02 | 12.7 | 11.63 | 0.79 | 97% | 2069 | 76 | 0 | 12000000 |
2022년 3월 14일 | 6:19:02 | 100.39 | 14.74 | 0.78 | 15% | 1034 | 29925 | 12000136 | 12000000 |
2022년 3월 14일 | 6:49:24 | 191.32 | 18.86 | 0.94 | 10% | 3374 | 36164 | 12001024 | 12000000 |
2022년 3월 14일 | 7:19:02 | 71.61 | 15.61 | 0.88 | 이십 삼% | 1610 | 30316 | 12000296 | 12000000 |
2022년 3월 14일 | 7:49:02 | 70.73 | 17.5 | 0.91 | 26% | 1408 | 29540 | 12000072 | 12000000 |
2022년 3월 14일 | 8:19:02 | 10.95 | 9.89 | 0.7 | 96% | 1709 화 | 75 | 0 | 12000000 |
2022년 3월 14일 | 8:49:02 | 11.01 | 10.22 | 0.73 | 99% | 239 | 85 | 0 | 12000000 |
/usr/bin/time 매뉴얼 페이지의 열 설명
e Elapsed real time (in seconds).
S Total number of CPU-seconds that the process spent in kernel mode.
U Total number of CPU-seconds that the process spent in user mode.
P Percentage of the CPU that this job got, computed as (%U + %S) / %E.
c Number of times the process was context-switched involuntarily (because the time slice expired).
w Number of waits: times that the program was context-switched voluntarily, for instance while waiting for an I/O operation to complete.
I Number of filesystem inputs by the process.
O Number of filesystem outputs by the process.
답변1
이 답변은 귀하의 예에 국한되지 않을 수도 있지만 질문에 대한 보다 일반적인 답변입니다. Generally, what happens during a swap in/out?
이 중 일부는 일반적인 것이므로 메모리 관리에 대한 박사 논문 작성을 피하기 위해 많은 부분을 얼버무렸습니다.
간단히 말해서 메모리 관리에 관한 것입니다. 용기 내부와 용기 외부로 구분됩니다. 먼저 디스크에서 데이터를 읽는 매우 간단한 사례를 살펴보겠습니다. 먼저 시스템은 데이터를 읽고 있는 변수를 살펴보고 커널에 그만큼의 메모리 공간을 요청합니다. 새로 부팅된 시스템에 있기 때문에 커널은 쉽게 메모리를 할당하고 이를 프로세스에 전달한 다음 디스크에서 메모리로 값을 복사할 수 있습니다. 간단하고 쉽고 빠릅니다.
그럼 약간의 복잡성을 추가해 보겠습니다. 시스템에서 점점 더 많은 작업이 시작될수록 CPU는 더 바빠집니다(분명히!). 이는 메모리 관리와 직접적인 관련이 없지만 어떤 프로세스가 CPU 시간 조각을 얻는지와 관련이 있습니다. 가장 이해하기 쉬운 스케줄러는 라운드 로빈 스케줄러입니다. 커널은 CPU 주기를 요청하는 프로세스 목록을 살펴보고 목록에 나타나는 순서대로 각 프로세스에 동일한 주기 수를 제공합니다. 이는 일반적으로 목록에 자신을 추가하는 순서입니다. 그런 다음 프로세스 우선순위 개념을 추가합니다. 이는 일부 특수 프로세스가 다른 프로세스보다 더 빨리 목록의 맨 위에 도달한다는 것을 의미합니다. 일반적으로 이러한 유형의 명령( cp
)은 우선순위가 매우 낮으며 대부분의 시간이 디스크의 응답을 기다리는 데 소비되므로 CPU 시간을 너무 자주 요구하지 않습니다.
그런데 네트워크 저장소에서 데이터를 읽을 때 디스크 장치에 데이터 제공을 요청할 뿐만 아니라 네트워크 인터페이스에 대신 작업을 수행하도록 요청하기 때문에 대기 시간이 더 길어집니다. 다시 말하지만, 메모리 관리 논의와 직접적인 관련은 없지만 네트워크 디스크는 로컬 디스크보다 느리므로 I/O 요청이 완료될 때까지 기다리는 프로세스에 더 많은 시간을 소비합니다.
이제 한동안 운영되어온 시스템을 살펴보겠습니다. 대부분의 경우 "여유" 메모리 값이 예상치 않게 매우 낮다는 것을 알게 될 것입니다. 이것은 Linux가 RAM을 낭비한다는 의미입니까? 별말씀을요. 메모리 소비의 일부는 디스크 캐싱입니다.Linux가 내 메모리를 모두 차지합니다!이에 대한 배경 지식을 얻으십시오.
메모리 사용량이 높은 또 다른 이유는 Linux가 게으르다는 것입니다. Linux는 필요하지 않은 작업을 수행하지 않습니다. 그 중 하나는 메모리 페이지를 "사용 가능" 목록으로 되돌리는 것입니다. 프로세스가 메모리 페이지 사용을 마치면 커널은 페이지를 "clean"으로 표시하지만 "used" 목록에는 유지합니다. 이는 페이지를 다른 프로세스에서 즉시 재사용할 수 있다는 의미일 뿐입니다. 페이지는 "더티"로 표시될 수도 있습니다. 이는 해당 메모리를 사용하는 프로세스가 해당 메모리 사용을 마치고 디스크에 다시 쓰도록 요청했지만 다른 프로세스에는 해당 특정 페이지가 필요하지 않기 때문에 Linux는 때까지 기다립니다. 실제로 다른 사람이 이를 디스크에 플러시하고 페이지를 사용 가능한 것으로 표시하려면 이 정보가 필요합니다. 이는 디스크 캐싱에서 가장 흔히 볼 수 있지만 파일 쓰기에서도 볼 수 있습니다.
따라서 우리 시스템에는 "free" 목록에는 아무것도 없지만 "clean" 및 "dirty" 목록에는 많은 페이지가 있습니다. 약간의 메모리를 요구하는 새로운 프로세스가 등장하고 Linux는 "clean" 또는 "dirty" 목록에서 충분히 큰 공간 블록을 찾아야 합니다. 더러워진 경우 해당 페이지를 디스크에 강제로 플러시해야 합니다. 인간의 관점에서는 이는 "무료" 목록에서 페이지를 할당하는 것과 같이 즉각적으로 발생하지만 컴퓨터 관점에서는 실제로 훨씬 더 오래 걸립니다.
귀하의 경우, 컨테이너 자체는 새 것이고 컨테이너 내부의 모든 메모리는 "사용 가능"하지만 컨테이너를 실행하는 운영 체제에는 "사용 가능한" 메모리가 거의 남아 있지 않을 수 있으며 대신 "깨끗하고" "더티" 페이지 할당 목록이 있습니다. . 시스템이 사용량이 많으면 더티 페이지 새로 고침이 더 자주 발생하여 IO 대기 시간이 늘어나고 메모리 할당 시간도 늘어납니다.
가장 중요한 것은 시스템이 제대로 작동한다는 것입니다. 실행 중인 다른 모든 프로세스, 특히 소유하고 있는 우선 순위가 더 높은 프로세스에 대해 걱정하는 동안 시간 cp
이 더 오래 걸리는(시스템 및 사용자 시간 조각 증가 ) 과 같은 중요하지 않은 프로세스를 만들어야 합니다 . time
예, 실제로 Linux 메모리 관리에 대한 박사 학위 논문을 작성하는 것이 가능합니다. 그만큼 복잡합니다.