커널 2.6을 사용하는 Squeeze에서 이상한 메모리 관리 동작이 발생합니다. 나는 이것을 알아 내기 위해 nmon을 사용하려고합니다.
때때로 이로 인해 시스템이 30초에서 5분 동안 정지됩니다.
서버에는 4GB RAM이 있습니다.
nmon의 데이터는 다음과 같습니다.
- +1.6GB RAM이 무료입니다.
- 캐시가 약 350MB 감소했습니다.
- swapcached가 약 80MB 감소했습니다.
- 스왑 공간이 ~200M 증가했습니다.
- 활성 메모리가 약 1.3GB 감소
이런 일이 발생하면 서버는 어떤 제한에도 접근하지 않습니다. 이런 일이 발생한 직후 활성 메모리는 서서히 회복되고 캐시와 memfree는 자연스럽게 다운됩니다.
이는 폭주 과정으로 보이지 않습니다. OS가 갑자기 많은 메모리를 재할당했다가 천천히 다시 재할당하는 것 같습니다. 교환성은 거의 영향을 받지 않으므로 요인이 되어서는 안 됩니다.
무슨 일이 일어나고 있는지 추적할 수 있는 방법이 있나요? 왜 이 여유 메모리는 몇 초 내에 갑자기 나타나고 30분 이내에 캐시로 반환됩니까?
답변1
시스템 로그는 무엇을 말합니까? OOM으로 인해 커널이 프로세스를 종료하고 있다는 표시가 있습니까?
스왑 규모는 얼마나 됩니까? vm.
네임스페이스의 커널을 조정했습니까 ?
"더미"의 비용은 얼마입니까?
이 30분 동안 무슨 일이 일어날까요? 그것은 어떻게 vmstat -SM 3
생겼나요?
아마도 가장 중요한 것은: 어떤 애플리케이션을 실행하고 있으며 이로 인해 해당 애플리케이션이 (어떻게) 영향을 받는가 하는 것입니다.
답변2
알고 보니 DoS였습니다. 약 60개의 php5-cgi 프로세스가 생겨나서 30초 내에 종료되었으며, 1.6GB RAM을 빨아들인 후 종료되었습니다.
1.6GB를 차지하는 하나의 프로세스가 아니라 60개의 프로세스를 차지하기 때문에 내 로그에는 표시되지 않습니다. 옴 킬러가 그것을 죽이는 것이 아니라, 아파치의 무엇인가가 그것을 죽이고 있는 것입니다.
프로세스의 폭을 파악하기 위해 프로세스 로깅을 조정하고 메모리를 추가하기 위해 몇 가지 awk 스크립트를 작성했을 때 마침내 그것을 발견했습니다. 이제 분명한 것 같습니다.