왜 Linux가 "사용 가능한"메모리를 이상하게보고합니까?


44

이것은 Unix 운영 체제가 메모리 사용량을보고하는 방법에 대한 정식 질문 입니다.
유제:

데비안 6.0.6 Squeeze를 실행하는 프로덕션 서버가 있습니다.

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

cron 은 매일 백업 스크립트를 루트로 실행합니다.

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

모든 것이 완벽하게 작동하지만 Munin의 메모리 그래프 는 백업 후 캐시버퍼의 증가를 보여줍니다 .

그런 다음 백업 파일을 다운로드하여 삭제합니다. 삭제 후 Munin의 메모리 그래프캐시버퍼 를 백업 전 상태로 되돌립니다.

Munin 그래프는 다음과 같습니다.

외부 호스팅 이미지는 연결이 끊어졌습니다.


3
축하합니다,이 질문은 정식화되었습니다 (오늘 6 번째 질문과 비슷하며 가장 흥미롭고 가장 예
스러운

답변:


27

이것은 서버가 스왑 파티션 사용을 거부 하고이 사이트에서 몇 가지 다른 유사한 질문을 하는 것과 같은 "문제" 입니다. ( 높은 메모리 리눅스 서버에서 사용 , 리눅스에서의 메모리 사용량 , 메모리에 저를 실행하는 웹 서버 등)

메모리 소비가 캐시 에서 발생한다는 사실에주의하십시오 . 이것은 파일을 메모리에 보관하고 있음을 의미합니다. 캐시 된 메모리는 "사용 가능한"메모리입니다. 메모리 블록을 비워 두지 않고 OS에서 최근에 읽은 파일을 해당 공간에 유지합니다. 응용 프로그램에 해당 메모리가 필요한 경우 응용 프로그램에서 해당 메모리를 사용합니다. 그때까지는 자주 참조하는 경우 디스크에서 파일을 다시 읽지 않아도되는 기회를 막을 수 있습니다.

이 그래프에 따르면 유효 메모리 소비는 그래프의 전체 기간 동안 전혀 변경되지 않았습니다.


서버에 이러한 파일을 캐시하지 않도록 지시 할 수 있습니까? sync; echo 3 > /proc/sys/vm/drop_caches백업 후 실행해야한다고 생각 합니까?

13
@ stan31337 그렇습니다. 가능 하지 않습니다 . 이 파일을 메모리에 저장하면 비용이 들지 않습니다. 모든 캐시를 지우면 캐시되고 디스크에서 다시 읽어야하는 모든 파일이 시스템 속도를 저하시킵니다. 그것이 의도 한대로하게하십시오.
Jeff Ferland

2
@ stan31337 백업 파일을 삭제하면 OS가 자동으로 캐시에서 백업을 시작합니다 (따라서 여유 메모리를 삭제 한 후 다시 점프하는 이유)-Linux는 파일이 열리지 않고 열 수 없다는 것을 알기에 충분히 똑똑 파일 시스템 트리에서 도달하면 다시 액세스 할 수 없습니다. Jeff가 말했듯이 전체 FS 캐시를 덤프하고 싶지는 않습니다 (시스템은 디스크에서 해당 데이터를 다시 읽고 캐시해야하므로 실제로 서버 속도가
다소

61

당신은 발생하는 리눅스 내 램 먹었다 문제.

당황하지 마십시오.

이것은 문제가되지 않습니다.

시스템이 설계된대로 작동합니다.

문제는 운영 체제가 아닙니다. 문제는 "사용 가능한"메모리가 무엇인지 이해하는 것입니다.


유닉스 시스템은 단순히 프로그램을 실행하는 것 이상으로 메모리를 사용합니다. 메모리는 다음 용도로 사용될 수 있습니다.

  • 프로그램 실행 (활성 / 사용)
  • 전송중인 버퍼링 데이터 (버퍼)
  • 최근 디스크에서 읽거나 디스크에 쓴 데이터 캐싱 (캐시)
  • 물론 아무것도 (무료)

다음은 최신 Unix 시스템이 RAM 사용량을보고하는 방법에 대한 간략한 (그리고 대부분 불완전한) 둘러보기입니다.

사용 가능한 메모리 (OS 정의) 란 무엇입니까?

유닉스 시스템이 RAM을 Free 로보고 할 때는 "이 RAM을 아무 것도 사용하지 않습니다"라는 의미입니다.
Free RAM은 사실상 쓸모가 없습니다. 시스템을 더 빠르게 만들지 않고 무언가를 필요로하는 경우에 대비하여 "무료"상태로 앉아 있습니다. 위에서 언급 한 다른 세 가지 항목 중 하나 일 수 있습니다.

캐시 및 버퍼 메모리 란 무엇입니까?

캐시 및 버퍼 메모리는 운영 체제에서 시스템 속도를 높이기 위해 사용하는 RAM입니다.
이 메모리는 현재 프로그램을 실행하는 데 필요하지 않으므로 OS는 자주 사용하는 데이터를 보유하기 위해이 cache메모리를 사용합니다. 시스템은 화면에 "Hello World"를 인쇄하는 데 필요한 지침을 찾기 위해 디스크로 이동할 필요가 없습니다.
실제로는 공유 메모리, 유선 메모리 등이 있지만 그보다 훨씬 복잡 하지만 우리의 목적을 위해이 간단한 설명이 적합합니다.

액티브 메모리 란?

활성 메모리는 "사용 된"메모리 (애플리케이션이 무엇을 하든지 사용하는 RAM), 스프레드 시트 정렬, 웹 페이지 제공, 그래픽 편집 등으로 이해됩니다.
"활성"메모리는 최근 "활성"입니다. -프로그램이 콘텐츠 (읽기 또는 쓰기)를 사용했다고 주장하며 스왑 아웃에 적합한 후보로 간주되지 않습니다.

비활성 메모리 란 무엇입니까?

활성 메모리와 마찬가지로, 비활성 메모리는 응용 프로그램이 무엇을 하든지 사용하는 RAM입니다. 차이점은이 메모리에 잠시 동안 액세스하지 않았기 때문에 푸시가 OS를 밀어 넣으면 디스크로 교체 할 수 있다고 생각하고 프로그램이 다시 요청하지 않을 것이라고 주장하는 프로그램은 약간의 운이 있습니다. 눈치 채지 못할 것이다.

"사용 된"메모리 란 무엇입니까 (HUMAN 정의)

"사용 된"메모리로 생각하는 것은 기본적으로 활성 및 비활성 메모리의 합계입니다. 모든 RAM은 현재 응용 프로그램에서 사용한다고 주장했습니다.
활성 및 비활성 메모리의 합보다 RAM을 더 많이 설치하고 (최고 512-1024MB의 안전 마진) 좋은 위치에 있다면 OS 가 스왑을 치지 않고 성능을 저하시키지 않을 입니다. .

"Free"메모리 (HUMAN 정의) 란 무엇입니까?

당신과 내가 "무료"메모리로 생각하는 것은 프로그램을 실행할 수있는 메모리입니다.
이것은 OS 보고서의 "무료"수치보다 약간 더 복잡합니다. 프로그램이 RAM을 요청하면 운영 체제는 다음과 같은 방식으로 해당 RAM을 최소한의 방식으로 가져 오려고 시도합니다.

  • 사용 가능한 메모리가 없으면 (아무것도하지 않고) 해당 RAM이 할당됩니다.
  • 사용 가능한 메모리가 없으면 OS는 캐시 및 버퍼 공간을 잠식합니다. 버퍼 풀에서 가장 최근에 / 최근에 자주 액세스하는 항목이 던져지고 해당 RAM이 프로그램에 제공됩니다.
  • 버퍼링 / 캐시 RAM이없는 경우 스와 퍼는 비활성 메모리를보고 액세스 가능성이 가장 낮은 영역을 선택합니다. 해당 데이터는 스왑 (디스크) 및 프로그램에 새로 추가 된 RAM 으로 페이징됩니다 .
  • 모든 비활성 RAM이 스왑 아웃 된 경우 스왑 퍼는 디스크에 활성 RAM을 배치하기 시작합니다.
    (이것은 성능이 일반적으로 개에게가는 곳입니다. 프로그램이 CPU를 켤 때마다 스왑 아웃 비트를 RAM으로 다시 가져와야합니다. 즉, 다른 프로그램의 활성 메모리를 스왑해야 합니다. 스왑의 높은 회전율을 스 래싱 이라고합니다 )
  • 시스템이 스왑 파티션을 채울 수있는 모든 시스템을 스왑하거나 스왑 파티션 없이 시스템 실행하는 경우 나쁜 일 이 발생합니다. 이 시점에서 다음 두 가지 중 하나가 발생합니다.
    • malloc()실패합니다. 이것은 POSIX 호환 동작입니다. 운영 체제는 프로그램이 요청을 충족시킬 수 없다는 것을 RAM에게 요청합니다.
      프로그램은 더 적은 RAM을 요구하거나 더 작은 메모리 청크로 할 수없는 경우 정리하고 종료 할 수 있습니다. (프로그램이 잘못 작성된 경우 단순히 충돌합니다.)
    • Linux 박스를 사용하는 경우 OOM-Killer 는 갱 스타일 드라이브를 사용하여 다른 프로세스를 종료하여 요청을 충족시키기에 충분한 RAM을 확보하려고 시도 할 수 있습니다.
      여기의 설명과 관련 질문에 대한 대답을 말할 수없는 경우 이것이 문제를 처리하는 끔찍한 방법이라고 생각합니다.

파일을 삭제할 때 여유 RAM이 증가하는 이유는 무엇입니까?

이 질문의 예에서 백업 파일을 삭제하여 RAM을 "사용 가능"할 수 있음을 알았습니다. 이에 대한 설명은 매우 간단합니다. 파일을 사용하는 파일이없고 (열린 파일 핸들 없음) OS는 아무도 해당 데이터에 다시 액세스하지 않으며 파일 시스템 캐시에서 데이터를 제거한다는 것을 알고있는 파일 시스템 (연결되지 않은)입니다.
이렇게하면 OS 보고서가 더 많은 여유 메모리가되지만 시스템 성능에는 영향을 미치지 않습니다.


이제는 나에게 완벽하다 ... 나의 리눅스 경험은 다소 2 개월이다.이 데비안 서버로 시작했다. 한 달 전에 필자는 가정용 랩톱에 Gentoo를 설치했으며 업무용 컴퓨터에서도 Windows 사용자에서 Linux 사용자로 완전히 변경된 성능에 놀랐습니다. 젠투로 리눅스를 배우는 것은 좋지만 아직도 배울 것이 많습니다.

@ stan31337 확실하지 않은 유일한 사람은 아닙니다. Windows 배경에서 온 사람들에게는 특히 어렵습니다. Windows를 자세히 살펴 보지 않으면 Windows가이 수준의 세부 정보로 메모리 사용량을보고하지 않기 때문에 프로그램에 의해 "사용"됩니다. ) 및 "무료"(프로그램 수강). 활동 모니터는 기본적으로 그래픽 버전이며 Free / Wired / Active / Inactive RAM 의 그래픽 버전이므로 Mac 사용자는 조금 더 쉽습니다 top.
voretaq7

나는 Windows에서 Process Explorer 로 작업을 했는데, 보여줄 메모리가 많았지 만 대부분은 나에게 분명하지 않아서 실제로 보지 않았다.

2
또한 Windows는 일반적으로 그 정도의 세부 사항을 보여 주지는 않지만 매우 유사한 설정을 가지고 있습니다.
Joachim Sauer

Windows에서도 메모리 판독이 혼란 스럽다는 것을 알고 있습니다. 이것은 OS 제조업체가 더 강조하고 싶거나 오히려 사용자가 현재보다 덜 신경 써야 할 것입니다.
gparent

2

위의 내용이 실패했는지 확인해야 할 사항이 있습니다.

슬래브 캐시 (의 사용 확인 Slab:, SReclaimable:SUnreclaim:에서를 /proc/meminfo). 이것은 커널 내부 데이터 구조의 캐시이며로보고 된 페이지 캐시와는 별개입니다 free.

슬래시 캐시가 "누락 된 메모리"의 많은 부분에 대해 리포지토리 인 경우 슬래브 캐시가 /proc/slabinfo어디로 갔는지 확인 하십시오. dentries 또는 inode 인 경우이를 sync ; echo 2 > /proc/sys/vm/drop_caches제거 할 수 있습니다.

slabtop도구를 사용하여 Slab 캐시의 현재 사용량을 친숙한 형식으로 표시 할 수도 있습니다 . c현재 캐시 크기별로 목록을 정렬합니다.

보낸 사람 : https://stackoverflow.com/a/5467207

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.