성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
[이승준] 완전히 잘못 짚었습니다. 댓글 지우고 싶네요. 검색을 해보...
[정성태] 우선 답글 감사합니다. ^^ 그런데, 사실 저 예제는 (g...
[이승준] 수정이 안되어서... byteArray는 BYTE* 타입입니다...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>리눅스 환경에서 디스크 용량 부족 시 원인 분석 방법</h1> <p> 리알못이라, 같은 처지의 분들에게 도움이 될 수 있도록 기록을 남깁니다. ^^<br /> <br /> 우선, 디스크 용량이 부족해서 응용 프로그램들이 오류가 발생하는 상황이었습니다. 그렇다면 이제 할 일은, 도대체 어떤 응용 프로그램에서 디스크 용량을 과다하게 사용하는지 알아내야 합니다. 제 경우 기존의 윈도우 환경이라면, <a target='tab' href='https://www.sysnet.pe.kr/1/0/993'>spacesniffer</a>를 곧잘 사용하는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 디스크의 폴더별 사용량을 한눈에 보여주는 SpaceSniffer 유틸리티 소개 ; <a target='tab' href='https://www.sysnet.pe.kr/1/0/993'>https://www.sysnet.pe.kr/1/0/993</a> </pre> <br /> 리눅스 Guy들은 다음과 같은 명령어를 터미널 화면에서 입력한다고 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>du -m -d 1 | sort -n -r</span> 676907 . 435643 ./var 118590 ./docker-data 64358 ./home 3914 ./lib ...[생략]... 0 ./proc 0 ./dev </pre> <br /> 그런데, 저 -m 옵션이 "block-size=1M"라고 하는데요, 그렇다면 ./var가 430GB라는 건가요? 암튼 좀 용량 계산이 직관적이지 않습니다. 와중에 다른 동료가 -h 옵션으로 하라고 해서 돌려보니 이번엔 약간 다릅니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>du -h -d 1 2>/dev/null | sort -n -r</span> 957M ./boot 116G ./docker-data ...[생략]... 2.1T . <span style='color: blue; font-weight: bold'>1.8T ./var</span> 1.3G ./run 0 ./sys 0 ./proc 0 ./dev </pre> <br /> 아하... ./var가 430GB가 아니라 1.8T였군요. (도대체 어떻게 계산하면 1.8T가 435643으로 나올까요? ^^;)<br /> <br /> 어쨌든 결과가 잘 나왔지만 이젠 sort의 옵션이 무색하게 되었습니다. 게다가, du에 준 "-d 1" 옵션의 효과가 "depth = 1"입니다. 즉, 저렇게 나왔으면 이제 다시 의심이 되는 "1.8T"의 "/var" 디렉터리로 내려가 추가로 명령을 내려야 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>du -h -d 1 2>/dev/null</span> 20K ./tmp ...[생략]... <span style='color: blue; font-weight: bold'>1.8T ./lib</span> 1.8T . </pre> <br /> 역시나 lib로 내려가 작업을 반복하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>du -h -d 1 2>/dev/null</span> ...[생략]... <span style='color: blue; font-weight: bold'>1.8T ./docker</span> ...[생략]... 1.8T . </pre> <br /> 범인이 대충 나왔습니다. docker의 overlay2 디렉터리가 원인이었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>du -h -d 1 2>/dev/null</span> 64M ./image ...[생략]... 199G ./containers 4.0K ./runtimes <span style='color: blue; font-weight: bold'>1.6T ./overlay2</span> ...[생략]... 20K ./builder 1.8T . </pre> <br /> 혹시 범인이 현재 사용 중인 log 파일과 같은 경우라면 크기를 0으로 만드는 것도 좋은 방법입니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > 5 Ways to Empty or Delete a Large File Content in Linux ; <a target='tab' href='https://www.tecmint.com/empty-delete-file-content-linux/'>https://www.tecmint.com/empty-delete-file-content-linux/</a> # > access.log # : > access.log # true > access.log # cat /dev/null > access.log # cp /dev/null access.log # dd if=/dev/null of=access.log # echo "" > access.log # echo > access.log # echo -n "" > access.log # truncate -s 0 access.log </pre> <br /> <hr style='width: 50%' /><br /> <br /> 또는 그냥 간단하게 다음과 같이 명령을 내리는 것도 좋습니다.<br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>du -h -t 10G 2>/dev/null</span> 21G ./testdir/dump 22G ./testdir ...[생략]... 25G . </pre> <br /> 보는 바와 같이, ./testdir/dump 디렉터리의 크기가 비정상적으로 큰 것을 쉽게 인지할 수 있습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 회사의 주요 업무가 서비스를 만드는 것이고, 그걸로 docker를 사용한다면 아마도 운영환경을 세심하게 살피는 담당자가 있을 것이므로 이런 문제가 거의 발생하지 않았을 것입니다. 반면, ^^ 우리 회사처럼 docker를 단순히 테스트 환경으로 사용하는 경우라면, 개발자들이 너도나도 생성한 컨테이너는 어느 순간 관리가 안 되는 지경에 이릅니다.<br /> <br /> 그리고 이렇게 disk full 사태가 발생하는데요. ^^ 원인이 docker라는 것을 알았으니, 이제 docker의 자체 명령어로 실행 중인 컨테이너당 어느 정도의 디스크를 점유하고 있는지 확인하면 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>docker ps --format "{{.ID}}\t{{.Names}}\t{{.Size}}" -s</span> 75c0ab7da32d problem_diag_container 653.47GB (virtual 687.6GB) ...[생략]... // 또는, # <span style='color: blue; font-weight: bold'>docker ps --size --format '{{.Image}} {{.Size}}'</span> </pre> <br /> 다행히 저렇게 결과가 나왔으면 이제 해당 컨테이너를 생성한 담당자에게 이 사실을 알리고 조치를 취하면 됩니다. ^^<br /> <br /> 참고로, 이 외에도 docker system df 명령어도 기억해 둘 만합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # <span style='color: blue; font-weight: bold'>docker system df</span> TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 79 19 32.23GB 1.974GB (6%) Containers 83 33 830.4GB 0B (0%) Local Volumes 36 32 3.004GB 550.3MB (18%) Build Cache 0 0 0B 0B </pre> <br /> 그리고 윈도우 사용자라면 전체적인 디스크 사용량을 탐색기의 "This PC" 레벨에서 확인할 텐데요, 리눅스라면 df 명령어로 유사하게 확인을 합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>df -h</span> Filesystem Size Used Avail Use% Mounted on udev 63G 0 63G 0% /dev tmpfs 13G 1.3G 12G 11% /run <span style='color: blue; font-weight: bold'>/dev/mapper/ubuntu--vg-ubuntu--lv 1.7T 563G 1019G 36% /</span> tmpfs 63G 0 63G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 63G 0 63G 0% /sys/fs/cgroup ...[생략]... </pre> <br /> 복잡한 구성이 아니라면, 대개의 경우 "Mounted on"이 "/"로 되어 있는 값을 확인하면 됩니다. 위의 경우에는 1.7T 용량의 하드 디스크가 이제 1T 정도의 남은 용량이 있는 것입니다. 만약 디스크가 부족한 상황이라면 "Use%"의 값이 "100%"를 찍고 있을 것입니다.<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
7282
(왼쪽의 숫자를 입력해야 합니다.)