리눅스 메모리 사용량?

리눅스 메모리 사용량?

SAP 애플리케이션을 호스팅하는 서버에는 1TB의 메모리가 있습니다.

애플리케이션이 실행 중일 때 표시되는 메모리 사용량은 top약 700GB입니다. 애플리케이션이 중지되면 표시되는 메모리 사용량은 top10GB로 떨어집니다. 서버를 다시 시작하면 메모리 사용량이 1GB가 됩니다.

  • 실행 중인 애플리케이션이 없는데 top10GB를 사용했다고 표시되는데 다시 시작하면 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, 1 stdout및 2 입니다 stderr. 이 외에도 일부 쉘은 기본적으로 다른 파일 설명자를 여는 것 같습니다. 당신은 bash255개(터미널 I/O에도 사용됨)를 가지고 있고, 나는 10개를 가지고 있으며 이는 터미널이 사용하는 특정 /device가 아님 dash을 나타냅니다 . 0, 1, 2 및 255를 제외한 모든 항목을 끄려면 다음을 수행하십시오 ./dev/ttyttyptsbash

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-)

관련 정보