SAP 애플리케이션을 호스팅하는 서버에는 1TB의 메모리가 있습니다.
애플리케이션이 실행 중일 때 표시되는 메모리 사용량은 top
약 700GB입니다. 애플리케이션이 중지되면 표시되는 메모리 사용량은 top
10GB로 떨어집니다. 서버를 다시 시작하면 메모리 사용량이 1GB가 됩니다.
- 실행 중인 애플리케이션이 없는데
top
10GB를 사용했다고 표시되는데 다시 시작하면 9GB가 추가된 이유는 무엇입니까? - 재부팅하지 않고 9GB를 얻을 수 있습니까?
출력 free -g
:
free -g
total used free shared buffers cached
Mem: 1009 567 442 0 0 152
-/+ buffers/cache: 415 594
Swap: 1 0 1
답변1
Linux는 다른 운영 체제와 다르게 RAM을 사용합니다.
사용하지 않는 RAM을 거기에 두는 대신 Linux는 필요한 데이터를 저장합니다.생각하다RAM에서 사용할 수 있습니다. 모든 애플리케이션, 파일 등을 여기에 캐시할 수 있습니다.
따라서 Linux RAM 사용량은 응용 프로그램을 실행하는 데 사용되는 양보다 높습니다. 이 추가 사용량은 다른 항목에 의해 고소되도록 버퍼링됩니다. free -h
두 번째 줄을 실행사용된"사용된" 메모리 중 상당수가 실제로는 캐시되어 있다는 것을 알려줄 것입니다.
모든 메모리가 캐시되고 프로그램에 메모리가 필요한 경우 프로그램을 수용할 수 있을 만큼 캐시에서 충분한 메모리가 제거됩니다.
답변2
이는 애플리케이션이 중지되었음에도 불구하고 일부 파일 설명자가 여전히 열려 있기 때문입니다. 언급된 기술을 사용하여 열린 파일 설명자를 나열할 수 있습니다.여기.
재부팅하지 않고 파일 설명자를 닫아야 하는 경우 Graeme이 언급한 방법을 따를 수 있습니다.여기그러나 Graeme이 답변에서 강조한 것처럼 닫으려는 파일 설명자를 알아야 합니다. 그의 대답은,
문자 그대로 답변, 닫기모두파일 설명자 열기
bash
:for fd in $(ls /proc/$$/fd); do eval "exec $fd>&-" done
그러나 이는 쉘 입력 및 출력에 필요한 기본 파일 설명자를 닫으므로 실제로는 좋은 생각이 아닙니다. 이렇게 하면 실행하는 모든 프로그램은
tty
장치에 직접 쓰지 않는 한 터미널에 출력을 표시하지 않습니다. 실제로 제가 테스트한 결과stdin
(exec 0>&-
)를 닫으면 대화형 셸이 종료되었습니다.실제로 수행할 작업은 기본 셸 작업의 일부가 아닌 모든 파일 설명자를 닫는 것입니다. 이들은 0
stdin
, 1stdout
및 2 입니다stderr
. 이 외에도 일부 쉘은 기본적으로 다른 파일 설명자를 여는 것 같습니다. 당신은bash
255개(터미널 I/O에도 사용됨)를 가지고 있고, 나는 10개를 가지고 있으며 이는 터미널이 사용하는 특정 /device가 아님dash
을 나타냅니다 . 0, 1, 2 및 255를 제외한 모든 항목을 끄려면 다음을 수행하십시오 ./dev/tty
tty
pts
bash
for fd in $(ls /proc/$$/fd); do case "$fd" in 0|1|2|255) ;; *) eval "exec $fd>&-" ;; esac done
또한
eval
이는 변수에 포함된 파일 설명자를 리디렉션할 때 필요합니다. 그렇지 않은 경우 bash는 변수를 확장하지만 명령의 일부로 처리합니다(이 경우exec
명령을 시도0
하거나1
파일 설명자를 닫으려고 시도합니다). . 또한ls
(예: ) 대신 glob을 사용하면/proc/$$/fd/*
glob에 대한 추가 파일 설명자가 열리는 것처럼 보이므로ls
여기서는 가장 좋은 솔루션인 것 같습니다.고쳐 쓰다
이식성에 대한 자세한 내용은
/proc/$$/fd
다음을 참조하세요. 파일 디스크립터 링크 이식성. 이용할 수 없는 경우에는/proc/$$/fd
대체품(사용 가능한 경우)을 드립니다.$(ls /proc/$$/fd)
lsof
$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)