메모리 요구가 증가 할 때 Linux에서 대용량 디스크 캐시를 해제하지 않음


24

2.6.31-302 x86-64 커널에서 Ubuntu 실행 전반적인 문제는 '캐시 된'카테고리에 메모리가있어 계속 진행되며 응용 프로그램이 필요할 때도 해제되거나 사용되지 않는다는 것입니다.

여기에 '무료'명령에서 얻는 것이 있습니다. 이것의 어느 것도 언뜻보기에는 평범하지 않습니다.

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5750320    1608172          0       7848    1443820
-/+ buffers/cache:    4298652    3059840
Swap:            0          0          0

누군가가 할 말은 "리눅스는 그 메모리를 자동으로 관리하는 것입니다." 예, 메모리 관리자의 작동 방식을 알고 있습니다. 문제는 그것이 옳은 일을하지 않는다는 것입니다. 여기에서 "캐시 된"1.4GB는 예약되어 사용할 수없는 것으로 보입니다.

Linux에 대한 나의 지식은 3GB가 "무료"라고 말합니다. 그러나 시스템의 행동은 그렇지 않다고 말합니다. 최대 사용량 동안 1.6GB의 실제 사용 가능한 메모리가 소진되면 더 많은 메모리가 필요하고 (첫 번째 열의 '사용 가능'이 0에 가까워지면) OOM 킬러가 호출되고 프로세스가 종료되고 문제가 발생하기 시작합니다. 비록 의 '무료'- / + 버퍼 / 캐시 행이 여전히이 약 1.4 GB '자유'.

핵심 프로세스에서 oom_adj 값을 조정하여 시스템이 무릎을 꿇지 않지만 중요한 프로세스가 종료 되어도 그 시점에 도달하고 싶지 않습니다. 특히 1.4GB가 디스크 캐시를 제거 할 경우 여전히 "사용 가능한"경우가 있습니다.

여기에 무슨 일이 일어나고 있는지 아는 사람이 있습니까? 인터넷에는 Linux 'free'명령에 대한 멍청한 질문과 "여유 여유 메모리가없는 이유"가 넘쳐나고 있기 때문에이 문제에 대해 아무것도 찾을 수 없습니다.

내 머리에 들리는 첫 번째 일은 스왑이 꺼져 있다는 것입니다. 우리는 그것에 대해 단호한 sysadmin을 가지고 있습니다. 그들이 백업되면 설명에 열려 있습니다. 이것이 문제를 일으킬 수 있습니까?

다음은 실행 후 무료입니다 echo 3 > /proc/sys/vm/drop_caches.

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5731688    1626804          0        524    1406000
-/+ buffers/cache:    4325164    3033328
Swap:            0          0          0

보다시피, 약간의 캐시가 실제로 해제되었지만 약 1.4GB가 "고정"된 것으로 보입니다. 다른 문제는이 값이 시간이 지남에 따라 증가하는 것 같습니다. 다른 서버에서 2.0GB가 멈췄습니다.

나는이 기억을 정말로 되찾고 싶습니다 ... 어떤 도움이라도 가장 감사하겠습니다.

cat /proc/meminfo가치있는 것이 있다면 다음과 같습니다 .

# cat /proc/meminfo 
MemTotal:        7358492 kB
MemFree:         1472180 kB
Buffers:            5328 kB
Cached:          1435456 kB
SwapCached:            0 kB
Active:          5524644 kB
Inactive:          41380 kB
Active(anon):    5492108 kB
Inactive(anon):        0 kB
Active(file):      32536 kB
Inactive(file):    41380 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               320 kB
Writeback:             0 kB
AnonPages:       4125252 kB
Mapped:            42536 kB
Slab:              29432 kB
SReclaimable:      13872 kB
SUnreclaim:        15560 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3679244 kB
Committed_AS:    7223012 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        7696 kB
VmallocChunk:   34359729675 kB
DirectMap4k:     7340032 kB
DirectMap2M:           0 kB

3
캐시에 대한 설명은 없지만 (mmap'd 파일이 들어있을 것으로 생각되지만) 인류를 위해 삽과 생석회를 제거하고 "스왑이 필요하지 않습니다. RAM이 많다면! " 부스터. 그들은 합리적인 토론에 면역력이 있으며 위험합니다. OOM 킬러가 당신을 스토킹한다는 사실은 이것의 하나의 증상 일뿐입니다.
womble

내 생각과 일치 해. 충고 감사합니다. 스왑이 필요한 이유에 대한 다른 좋은 기사 나 주장을 알고 있습니까?
trisweb

6
스왑이 없으면 이와 같은 일이 발생하기 때문입니다. 그러나 스왑 데니어와 논쟁하려고하지 마십시오. 중 "당신이 여기에 스왑을하지 않으려면, 생석회을 끊거나 말을 당신은 당신이 만드는 고집 한이 혼란을 해결". 그들은 결국 스스로 마음을 바꾸거나 죽어 죽게 될 것입니다. 어느 쪽이든 문제가 해결되었습니다.
womble

팁을 주셔서 감사합니다. 당신은 mmmm'd 파일에 대해 옳았습니다. 빠른 lsof는 메모리를 차지하는 로그 파일을 보여줍니다. 그것들을 지우면 문제가 해결되었습니다.
trisweb

문제는 스왑없이 오버 커밋하면 OOM 킬러가 실행되고 오버 커밋하지 않으면 프로세스를 시작할 수없는 시스템에서 결과를 커밋하지 않는다는 것입니다. RAM을 효과적으로 사용하려면 스왑이 필요합니다.
David Schwartz

답변:


8

womble의 도움 덕분에 내 질문에 대한 답을 찾았습니다 (원하는 경우 답변을 제출하십시오).

lsof -s 사용중인 파일 핸들을 표시하고 캐시를 차지하는 수 기가 바이트의 mmap'd 로그 파일이있는 것으로 나타났습니다.

로그 로테이션을 구현하면 문제를 완전히 해결하고 더 많은 메모리를 활용할 수 있습니다.

또한 스왑을 다시 활성화하여 향후 OOM 킬러에 문제가 없도록합니다. 감사.


2
mmap'd 페이지는 버릴 수 있으므로 캐시가 고정되지 않아야합니다. 램프를 사용하고 있습니까?
psusi

안녕하세요, 오래된 스레드를 파서 죄송하지만 현재 동일한 문제가 발생 lsof -s하여 비정상적인 사용법이 표시되지 않습니다. 그러나 나는 당신이 말한 것처럼 램프를 사용하고 있습니다 (그리고 drop_caches 기능이없는 2.6.10 커널). 당신은 아마 의심되는 것 같아요?
Ram

1
팁 고마워! lsof -s | sort -rnk 7 | less도구 상자에 추가 하고 있습니다. 다른 독자를위한 참고 사항 :과 같은 큰 항목이있을 수 /proc/net/rpc/nfs4.nametoid/channel있지만 필자의 경우 범인으로 밝혀지지 않았습니다.
Nickolay 2016 년

큰 파일이나 프로그램이 mlock을 사용하고 있지 않은지 확인하십시오. 에서 /proc/meminfo"Unevictable"페이지를 봐주세요.
마이클 마르티네즈

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