안녕하세요
리눅스에서 메모리 사용량을 확인하는 방법이라는 주제로 한번 진행을 해 보려고 합니다
두 가지 편으로 나뉩니다.
일단 시스템 전체를 바라보는 편이 있고요
그다음에 프로세스별로 보는 것이 있습니다.
영상을 개별로 올리도록 하겠습니다
시스템 전체를 기준으로 메모리 사용량을 확인 하는 이유가 뭘까요?
아무래도 우리가 메모리 일을 어느 정도까지 쓸 수 있고 그리고 또 메모리에 대해서 문제가 생겼을 때
현재 사용량이 얼마나 있는지 그리고 더 나아가서는 프로세스별로 얼마나 쓰고 있고
메모리를 너무 많이 먹는 친구가 누군지 이런 것들을 확인할 때 필요할 수도 있겠습니다
시스템 전체를 기준으로 어느정도 메모리는 사용하고 있는지 그리고 또 무슨 용도로
사용하고 있는지를 확인하는 것들을 명령어를 입력하면서 확인 해 보도록 하겠습니다.
첫번째로 free라는 명령입니다
명령어를 우리가 모를 땐 어떻게 해야 되죠?
what is / man
이런 것도 쓸 수 있죠
what is free 하게 되면은 메모리 사용량에서 확인할 수 있는 방법이 있겠고요 man이라는 것을 쓸 수 있어요
man free 해서 manual page 그러니까 사용법에 대해서 manual page가 있습니다
그걸 기준으로 해서 상세 내용을 확인 할 수 있겠구요 q 키를 누르면 나갈 수가 있겠죠
여기서 이제 또 질문이 쓰실 수 있어요
1번이 뭐고? 3번이 뭐냐? 이거는요
man man을 / 메뉴얼의 메뉴얼 페이지를 보시게 되면요
이안에서 번호를 보실 수가 있습니다
보시게 되면은 1번이 뭔지 2번이 뭔지가 나오게 되요
아까 전에 1번, 3번 이였죠?
1번 일반적인 명령어 쉘 커맨드 라든지 어떤 사용자 프로그램에 대한 설명을 1번 이고요
3번은 Libray calls 라이브러리함수를 뜻하게 됩니다.
printf 라던지 scanf 라이브러리 함수 잖아요 그런 것들에 대한 설명은 3번입니다
가장 많이 나오는 게 1번 2번 3번 그리고 8번 그런 것들이 좀 많이 나오고 하거든요
그래서 메뉴얼 페이지 보면요 일반적인 사용자 명령어 뿐만 아니라 시스템 콜, 라이브러리 함수 그리고 또 시스템 Administrator 관리자들을 위한 어떤 시스템명령어
이런 것도 좀 분류해 가지고 번호별로 설명을 하고 있습니다
그래서 만약에 내가 설명을 1번을 기준으로 듣고 싶다
1번으로 지정해주시면 되고 3번을 기준을 설명을 보고 싶다
그러면은 라이브러리함수 설명을 기준으로 볼 때는 3번 시스템 콜 설명이 없으면 2번 섹션에 대한것은 없는거죠 이런 식으로 manual page 보는 것도 추가적으로 한번 설명을 드려봤고요
이것은 이제 좀 부가적인 설명이였고 free를 기준을 한번 보도록 하겠습니다.
free를 그냥 입력 하게 되면요 현재 메모리 기준으로 전체 메모리 사용량이 어느 정도인지 사용되고 있는 게 어느 정도인지 free 이제 안 쓰고 있는 게 어느정도인지
이런 것들에 대한 정보를 볼 수가 있거든요
그런데 Human-readable 조금 더 사람이 읽기 좋게끔 출력을 하게 되면은 이런식으로 메가(M, mega), 기가(G, giga), 킬로(K, kilo) 이런식으로 M,G,K 단위를 입력을 해서 볼 수가 있습니다
그렇게 되면 좀 더 읽기가 편하겠죠
그래서 이런식으로 읽어서 확인해 볼 수가 있는데요 여기서 total, used, free 제가 굳이 설명하지 않아도 당연히 이해할 수 있습니다
사용하고 있는 거 남아 있는 거 전체량 이런것들은 충분히 할 수 있지요
shared도 그렇게 어려운 건 아닌데 공유하고 있는 메모리공간 정도를 얘기하고 있는 것 여기서 문제는 뭐냐면 공부가 필요한 영역은 두 가지입니다
buff /cache, available이라는 항목 인데요
자 여기서 하나씩 설명을 드려 보면은 일단은 buff /cache, available, shared, free, total 이런 전체적인 것들이 결국에 total 메모리에 한정해서 같이 설명할 수 있는 거니까
전체가 100% 고 각각의 부분이 몇 퍼센트로 나눠 질수가 있겠죠
그런데 실제로 한번 계산을 해 보세요
이 전체를 더한다고 해서total이 나오냐? 그렇지 않거든요
그렇다고 used하고 free를 더한다고 해서 예를 들어서 덧셈을 해보도록 하겠습니다.
echo를 적어야 겠죠
두 개를 더 한다고 해서 다시 한번 해 보도록 할게요
total이 나오느냐? 나오지 않습니다 좀 모잘라요
그러면은 shared를 더한다고 해서 total이 나오느냐? buff /cache 더 한다고 해서
total이 나오느냐? 이런 것들을 확인해 보실 수가 있을 텐데 실제로 더하시다 보면은 buff /cache 더했을때 total이 딱 떨어지는 것을 보실 수가 있어요
여러분들 실제로 명령어를 입력해 보시고요
used, free, buff /cache를 더했을때 total과 똑같은지 확인을 해보세요 저렇게 증명하는 습관이 정말 중요합니다
그렇다면 used 사용하고 있는 거 free 사용하지 않는 거를 더했을때 상식적으로 보면 total이 맞는데 왜 맞지 않을까?
자 여기서 부가적인 설명이 필요한 게 사실이 buff /cache는 used 입니다.
used, buff /cache 사용하고 있는 건 똑같아요 하지만 사용하고 있는 어떤 방법이 좀 다른데요
used 는 스택(stack)이라든지 힙(heap) 처럼 일반적으로 배열 혹은 이제 malloc 이라든지 new 이런 함수를 통해서 이런 것을 통해서 일반적인 스택(stack), 힙(heap) 공간을 사용하는
순수한 메모리영역을 used 부르게 되고요 전문용어로는 Anonymous 영역이라고도 부르게 됩니다.
페이지캐시 라고 해서 디스크에 있는 파일내용, 정보가 메모리에 올라와 있을 때 그럴 때 buff /cache 라고 부르게 되거든요
힙(heap)공간으로 사용하는 공간을 뜻하는 것이 아닙니다.
메모리 사용하는것은 맞아요
디스크에 있는 내용이라던지 파일내용, 정보내용 이런 것들 디스크 블록 이런 것들이 메모리에 올라와 있을 때
buff /cache라고 부르게 되고 그런양을 얘기 하게 됩니다
그런게 왜 필요할까요?
아무래도 디스크는 좀 느려요 느리기 때문에 디스크에 있는 내용들을 미리 읽어다가
메모리에 올려 주는것이 필요 할 수가 있죠 이런 것들을 전문용어로 영어로 뭐라고 말해 시리라고 바라겠습니다
미리 읽어놓은 데이터 cache 말하게 되고요 cache 라는 용어는 사실 여기저기 많이 쓰여요
그래서 어느 레벨 계층에서 미리읽어 놨다고 정확하게 명시하는 굉장히 중요합니다
메모리에서 미리 읽어와서 cpu의 가져왔으면 cpu 내부에 있는 SRAM 캐시를 얘기하기 되는데 그건 CPU 캐시 (예: L1, L2 등)를 뜻하게 됩니다.
여기서 말하는 캐시는 디스크에 있는 내용을 파일내용을 메모리에다가 미리 읽어 주니까 디스크 있는것을 비대면 미리 읽어 났을 때의
캐시를 뜻하게 됩니다. 동일하게 캐시란 영어로 쓰다 보니까 굉장히 헷갈리죠
한 가지 예시만 더 들어 보면은 웹 서버에 있는 내용을 미리 읽어다가 웹 브라우저 에다가 저장해 두게 되면
그것 또한 캐시라고 말하게 됩니다. 하지만 이번에 계층이 다르져 웹 서버에서 웹 브라우저를 미리 읽어본거죠
미리읽었다는 뜻은 똑같지만 계층이 다르기 때문에 정확하게 이해하시게 중요할 수 있겠죠 여기는 디스크에 있는 내용을 미리 읽어서 올려둔 양입니다
여기에는 도대체 뭐가 들어갈까
구체적으로 일단은 우리가 프로그램 실행한다. 프로그램을 실행 한다는 거는 ps - ef로 현재 실행중인 프로세스 전체를 볼 수가 있어요
그런데 여기에 있는 내용을 만약에 WC - 1로 라인수를 재게되면요 헤더를 제외하고 나서 지금 139개 정도에 프로세스가 구동중인 것을 볼 수가 있습니다
프로세스들 어쨌든 프로그램이고 프로그램 중에는 Mysql, nginx, postgresql에서 tomcat 다양한게 있겠죠 그런데 그 프로세스별로 파일이에요
.exe 같은 그런 실행파일이 디스크에 있을 거잖아요
그런 파일들도 메모리에 올라 와야 되기 때문에 그런 내용을 포함하고 있고요
뿐만아니라 우리가 웹서버, DB 이런 걸 쓰다 보면 수많은 사이즈를 다루게 되죠
그런 파일들을 읽고 쓰다보면 이 버퍼캐시 공간에 들어가게 됩니다
그러면 여기서 한번 질문 드려 볼 수 있을 것 같아요
실제로 used, buff/ cache 중에서 뭐를 더 많이 쓸까요?
전세계 수많은 리눅스 서버 존재하고 리눅스 환경에 존재하는데 used, buff/ cache 중에서 무엇이 메모리를 더 많이 차지 할까요
절대적인 답이 있는 건 아니겠지만 일반적으로 buff/ cache 훨씬 많이 쓰입니다.
used라고 생각하시는 분들도 있을꺼에요
메모리라고 하면 아무래도 스택(stack)이라든지 힙(heap) 이런 것들을 떠올리기 마련 하지만 실제로는 우리가 파일을 읽는 경우가 많습니다.
어쨌든 프로그램도 파일이기 때문에 파일을 메모리에 두는 경우가 정말 많아요
그러기 때문에 buff/ cache를 사용하는 경우 일반적으로 굉장히 많습니다.
그래서 파일IO와 메모리는 사실 뗄 수가 없는 사이라고 볼수 있어요
파일IO와 메모리 사이에 관계도 나중에 한번 기회가 되면 다른 영상으로 한번 말씀을 드려 보면 좋을 거 같습니다.
일단은 buff/ cache설명은 끝났어요 이제 available 중요한데요
available 대충 설명하고 대충 이야기 하고 넘어가는 경우가 정말 많습니다 정확하게 이해하는것이 중요한데요
available은 추정치입니다 어떤 추정치 냐면 만약에 프로세스가 새로 시작한다고 했을 때
어느정도를 쓸수 있는지를 추정한(계산한) 메모리 수치예요
이거는 실제로 free 굉장히 헷갈리실 수 있는데 이만큼이 남아돈다는 얘기가 아닙니다
얘는 추정이에요 계산을 한 거예요 추정을 해 본 거예요 만약에 내가 프로세스가 새롭게 시작했어
새로운 프로세스 시작됐어 그랬을 때 영혼까지 끌어모아서 도대체 어느 정도 쓸 수 있어? 예측 한번 해보래?라고 해서 그 수치를 계산을 해 놓은 거죠
그래서 이만큼이 지금 당장 남아있다라는 뜻은 아닙니다
그래서 사실상 available요 free를 포함하고 있고요 굳이 얘기하자면 free와 buff를 조금 더해 놓은 양이라고 볼수 있어요
물론 buff/ cache에 대한 내용을 전부 다 버릴 수는 없기 때문에 완벽하게 털어 낼순 없겠지만 buff/ cache 결국에 디스크로부터 미리 읽어 놓은 것이기 때문에
메모리에서 해지를 한다고 해서 오류가 발생한다고 볼 수는 없습니다.
다만 당장 읽고 쓰고 있는 것이 있기 때문에 완전히 버릴 수는 없죠 어찌됐든 buff/ cache에 있는 내용 그리고 털어낼 수 있는 만큼 미리읽어본것이기 때문에 털어낼수 있을 만큼 털어내고
그 다음에 free를 더한 양정도가 available수치 해당되게 됩니다.
우리가 전체적으로 메모리를 얼마나 사용하고 있고 얼만큼 비워있고 이런 것들을 볼 수가 있겠구요
조금 더 눈으로 보기 쉽게 나올수 있는 명령어가 HTOP 입니다
htop같은 걸 보게 되면은 전체적으로 어느정도를 쓰고 있는지를 보기가 좋구요
전체 메모리공간 중에서 메가(M, mega), 기가(G, giga) 이 정도를 쓰고 있는지를 그림상으로 이제 htop죠 그림상으로 보기가 조금 더 편하게 되어 있는 것을 볼 수 있습니다
그리고 이제 수치상으로 보게 되면은 아무래도 free하고 used, buff/ cache기준으로 해서 분모,분자를 두고 퍼센트계산 하시려면 퍼센트를 또 볼 수는 있겠죠
우리가 시스템 사용량에 대해서 한번 확인을 해봤습니다.
한가지만 더 얘기를 하고 마무리를 할께요
일단 시스템 메모리 양에 대해서 얘기를 할 때 볼 수있는 방법 free 명령을 말씀을 드렸는데요 이렇게 proc/meminfo라는 것도 있습니다
cat proc/meminfo meminfo 전체적인 것을 다 볼 수도 있겠지만 제가 항상 리눅스 공부할때마다 말씀을 드리는 당부사항은 너무 세부적인 내용들부터 다 읽어서 외우고 공부 하는 것을 추천 드리지 않아요
일단 상식적으로 생각할 수 있는 단순한것들 아주 심플한 것들부터 시작을 해서 이해를 하고 그 다음에 조금 구체적으로 조금 더 구체적으로 이런 식으로 Drill-Down 방식으로 하나씩 구체적으로 가는 것을 좀 추천 드립니다 너무 세부적인것들을 다 공부하다보면 도대체 어디까지 공부해야 되지 너무 힘들고 끝이 없는 무한함을 보실 수가 있을 거예요 상식적으로 접근할 수 있는 심플한 것들부터 시작해서
단순한 것도 시작해서 공부하고 그 다음에 조금 더 구체화해 보고 이런 접근 방식을 좀 추천드립니다
그래서 전체를 다 보지 말고 일단은 다섯 개만 볼게요
전체 토탈 메모리에 대해서 KB 기준으로 보이고 있구요 free 진짜로 사용하지 않고 있는 공간 available아까 설명을 드렸구요
buff/ cache 이번에는 두개로 나눠져 있잖아요
여기서 말하는 buffers cached들은 둘다 사실은 의미가 똑같습니다 어떤 의미냐면 디스크에 있는 것을 미리 읽어 놨다는것은 똑같아요
하지만 굳이 두 개를 나누자면 buffers는 파일정보 (inode block 등) Cached는 파일내용을 그림상으로 만약에 살펴본다면
이런 식으로 볼 수가 있겠구요 디스크에 있는 것들이 파일이 잖아요 파일정보를 담기 위해서 inode 라는 단위로 파일정보를 담고 있어요
그리고 파일 내용들도 있겠죠 데이터 블록 등 그런데 만약에 텍스트 파일하고 비디오 파일 비교한다면 비디오 파일이 훨씬 내용이 크겠죠
하지만 텍스트 파일은 몇 KB밖에 되지 않지만 정보는 비슷할겁니다 파일 정보에 대한 inode 크기는 그렇게 크게 차이 나지 않을 거예요
상대적으로 buff/ cache를 비교했을 때 cache가 훨씬 많다 왜냐면 이제 파일 내용 데이터블록 에 해당되기 때문이라고 말씀드릴 수가 있겠구요
bufferd / Cached가 됐든 두 개다 사실상 리눅스 안에서는 pagecache라는 용어로 통일해서 설명하게됩니다.
페이지는 페이지인데 메모리를 관리하는 단위 4KB 페이지 조각은 똑같은 페이지인데 스택(stack)이라든지 힙(heap) 공간으로 사용하게 되면
Anonymous page라고 지칭하게 되고요
똑같은 4KB 페이지만 파일에 내용이라든지 파일에 정보를 담게 되면 pagecache라고 하지만 여기서 한 번 더 구체화해서 똑같은 pagecache이지만
디스크에 있는 내용을 올려놓은 건 똑같아 하지만 파일이 정보를 담고 있다면 Buffers 파일의 내용을 담고 있다면 Cached 지칭을 하게 되는겁니다.
시스쳄 전체적으로 메모리는 어떻게 쓰고 있고 얼마나 쓰고 있는지 들을 구별해서 확인할 수 있는 /proc/meminfo, free 명령어를 통해서 한번 사용량에 대해서 확인해보았습니다.
구체적으로 프로세스별로 보고 시스템 전체적으로 퍼센트를 계산해 볼 수 있거든요
이런 것들은 파이썬 스크립트 같은 걸로 한번 해 보려고 하는데 그것은 다음 영상에서 이어서 가보도록 하겠습니다. 감사합니다