저는 모든 종류의 "차단"에 극도로 민감하고 응답성이 매우 뛰어나며 대부분의 경우 완벽한 대기 시간을 유지해야 하는 실시간 네트워크 애플리케이션을 가지고 있습니다.
안타깝게도 애플리케이션 자체(멀티 스레드)는 메모리를 많이 사용하므로 약 6GB의 RAM이 필요합니다.
시스템에는 8GB RAM과 2GB 스왑 공간이 있습니다. 일부 성능 문제, 스왑 이벤트와 관련된 애플리케이션 대기 시간 증가(15초마다 grafana 및 node_exporter를 사용하여 OS 모니터링)가 관찰되었으며, 동시에 심각한 대기 시간이 발생하면서 OS가 일부 페이지를 스왑하고 있었습니다(여전히 2GB 여유 공간이 있음). 공간) 메모리).
나는 Linux 커널 VM 하위 시스템을 매우 잘 알고 있으므로(Mel Gorman의 저서 "Linux® 가상 메모리 관리자 이해"를 읽었습니다) 이를 비활성 페이지를 적극적으로 교체하는 OS와 결합하여 더 많은 FS 캐시/버퍼링을 얻었습니다. 애플리케이션의 대기 시간에 큰 영향을 미치지 않는다면 신경 쓰지 마세요.
커널이 메모리 부족 워터마크에 도달할 때 최후의 수단으로만 스왑을 사용하도록 설정했지만 vm.swappiness = 0
소용이 없었습니다. 거의 같은 크기의 작은 메모리 덩어리를 계속 교체합니다. 30분마다 한 번씩, 애플리케이션 대기 시간에 심각한 영향을 미칩니다.
도움이 된 유일한 방법은 스왑을 완전히 비활성화하는 것이었습니다. 그렇게 한 이후로 지연 문제는 다시는 발생하지 않았습니다. 그러나 응용 프로그램이 일시적으로 총 사용량 8GB에 접근하는 더 많은 메모리를 필요로 하는 불행한 상황이 발생하는 경우 OOM Killer는 이제 일부 비활성 페이지를 교체하는 대신 메모리를 종료하므로 문제가 됩니다. 마비.
그래서 두 가지 질문이 있습니다.
- 이러한 소규모 교체 이벤트가 애플리케이션 대기 시간에 큰 영향을 미치는 이유는 무엇입니까? 제가 이해한 바에 따르면 스위치는 어쨌든 비활성 메모리 페이지를 제거합니다. 스위치가 메모리를 이동할 때 RAM에 없거나 이동 중인 페이지에 액세스하려고 시도하지 않더라도 프로세스가 정지됩니까?
- 필요한 경우에만 커널을 강제로 교체하는 방법이 있습니까? 예를 들어. - RAM > 1GB가 아직 사용 가능한 경우 교체하지 않으시겠습니까?
답변1
불행하게도 커널이 실제로 무엇을 하는지에 대한 답은 없습니다. 그러나 특정 문제를 해결하는 데 도움이 될 수 있는 몇 가지 사항이 있습니다.
- 더 많은 메모리 확보
- 더 적은 RAM을 사용하고 최적화됨
- 디스크로 교체하는 대신 ZRAM으로 교체하면 속도가 훨씬 빨라집니다. 기본적으로 페이지를 교체하면 디스크에 쓰는 대신 메모리에 압축하기만 하면 됩니다. 압축 알고리즘의 오버헤드가 있더라도 훨씬 빠릅니다.
- 아직 사용하지 않으신다면 RT-linux 커널 패치 세트를 사용해 보세요. "실시간 Linux" 프로젝트의 요점은 대기 시간 목표를 놓치면 누군가가 죽게 되는 애플리케이션을 실행하는 것입니다. 따라서 여기서는 이런 종류의 치명적인 대기 시간 문제가 발생하지 않을 것이라고 가정합니다. 적어도 그러지 않기를 바랍니다. 그건 끔찍할 것입니다. 대부분의 배포판에는 rt 커널을 사용할 수 있습니다.
- LE9 커널 패치는 특히 메모리가 부족한 상황에서 스와핑 동작을 처리하므로 어느 정도 관련성이 있을 수 있습니다. Linux 커널은 실행 가능한 코드/라이브러리가 포함된 페이지를 기본 스왑 자료로 간주하고 먼저 교체합니다. 그러면 프로그램이 해당 코드를 실행하기 시작하고 페이지 오류가 발생하고 페이지를 교체하는 동안 정지된 다음 계속됩니다. 내가 이해한 바에 따르면, LE9 패치는 실행 가능한 페이지가 즉시 교환되지 않도록 보호하여 메모리가 부족할 때 해당 페이지가 손상되는 것을 방지하여 시스템이 정지되는 대신 정상적으로 처리할 수 있도록 합니다.
교환하면 어떻게 될지는 모르겠지만나가, 교체할 때마다 프로세스가 확실히 중지됩니다.존재하다, 이것이 페이지 폴트가 처리되는 방식입니다. 일부 메모리에 액세스하려고 하는데 페이지가 로드되지 않고 커널이 모든 것을 중지하고 페이지를 로드한 다음 요청했을 때 메모리가 없기를 바라면서 프로그램을 다시 시작합니다. 나는 무언가가 교체되면 결국 다시 교체될 것이고 프로세스가 확실히 중단될 것이라고 가정합니다. 이런 일이 일어나고 있을 수도 있습니다.
답변2
안타깝게도 애플리케이션 자체(멀티 스레드)는 메모리를 많이 사용하므로 약 6GB의 RAM이 필요합니다.
(...)
시스템에는 8GB RAM이 있습니다.
시스템에 메모리가 부족합니다. 문제를 해결하는 유일한 방법은 메모리를 추가하는 것입니다.
메모리에서 스왑 아웃된 페이지는 디스크에 기록된다는 점을 기억하세요.훨씬 느림읽기/쓰기 액세스 권한은 RAM보다 높습니다. 이것이 애플리케이션 속도가 느려지는 이유일 것입니다.
swappiness가 0으로 설정된 경우에도 Linux가 스와핑을 수행하는 것으로 관찰되었습니다. 관련 질문:Linux는 "기회적 교환"을 수행합니까, 아니면 신화입니까?