Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 메모리 사용량이 높은 문제를 해결하고 싶습니다.
간략한 설명
EC2 Linux 인스턴스의 메모리 사용률이 높으면 시스템 성능이 저하되거나 정지될 수 있습니다. 이러한 성능 문제는 일반적으로 메모리 누수, 메모리 사용량이 많은 프로세스 또는 불충분한 메모리 할당으로 인해 발생합니다. 이러한 문제를 해결하려면 먼저 Linux 시스템 도구를 사용하여 문제의 근본 원인을 파악하십시오. 그 후 문제 원인에 대한 문제 해결 단계를 따르십시오.
해결 방법
문제의 근본 원인 파악
문제 원인을 파악하려면 EC2 인스턴스의 메모리 사용 패턴을 식별하십시오. 현재 메모리 사용량을 확인하려면 다음 명령을 실행합니다.
free -h
출력 예시:
total used free shared buff/cache available
Mem: 15Gi 7.2Gi 2.1Gi 1.2Gi 5.7Gi 6.3Gi
Swap: 8Gi 6.5Gi 1.5Gi
EC2 Linux 인스턴스에서 메모리 사용량이 많은 프로세스를 찾으려면 top 명령을 실행합니다.
top
출력 예시:
top - 14:23:45 up 15 days, 3:42, 1 user, load average: 2.15, 1.98, 1.75
Tasks: 256 total, 2 running, 254 sleeping, 0 stopped, 0 zombie
%Cpu(s): 24.8 us, 12.3 sy, 0.0 ni, 62.1 id, 0.8 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 32768.0 total, 2453.2 free, 24156.4 used, 6158.4 buff/cache
MiB Swap: 4096.0 total, 3012.5 free, 1083.5 used. 2537.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 mysql 20 0 18.2g 15.1g 5.1g S 45.0 47.2 220:31 mysqld
5678 tomcat 20 0 12.8g 11.2g 124m S 85.2 70.1 445:22 java
인스턴스에서 메모리를 가장 많이 사용하는 프로세스를 찾으려면 다음 명령을 실행합니다.
ps aux --sort=-%mem | head -n 5
출력 예시:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
mysql 1234 45.0 47.2 18.2g 15.1g ? Ssl Jan10 220:31 mysqldjava
5678 85.2 70.1 12.8g 11.2g ? Ssl Jan12 445:22 javaapache
9012 25.3 23.8 4.2g 3.8g ? Ss Jan12 178:44 httpd
스왑 활동이 많으면 시스템 속도가 크게 느려질 수 있습니다. 자세한 내용은 M1 및 C1 EC2 인스턴스의 인스턴스 저장소 스왑 볼륨 활성화를 참조하십시오.
스왑 활동을 확인하려면 다음 명령을 실행합니다.
vmstat 1 5
출력 예시:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 6650880 2150012 189408 5678024 45 67 234 567 300 450 65 15 10 10 0
메모리 사용 패턴에 따라 문제 해결
인스턴스의 스왑 사용률이 높음
다음 단계를 완료하십시오.
-
스왑 활용도를 줄이려면 다음 명령을 실행합니다.
sudo sysctl vm.swappiness=10
-
스왑을 지우려면 다음 명령을 실행합니다.
# Find processes using most swap
$ smem -s swap -r
# For specific process, check its swap usage
$ grep VmSwap /proc/[PID]/status
# Restart specific high-swap-usage processes during low-traffic periods
$ systemctl restart [service-name]
# Use Extreme caution when running this command - can cause OOM kills if physical memory is insufficient:
$ sudo swapoff -a && sudo swapon -a
중요: 인스턴스의 실제 메모리가 swap 명령에 충분하지 않은 경우 메모리 부족(OOM) 오류가 발생할 수 있습니다.
-
인스턴스에 더 많은 공간이 필요한 경우 다음 명령을 실행합니다.
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
시스템 전반의 메모리 문제가 있음
다음 단계를 완료하십시오.
-
OOM 오류를 확인하려면 다음 명령을 실행합니다.
sudo grep -i 'out of memory' /var/log/syslog
sudo dmesg | grep -i 'out of memory'
sudo journalctl -k | grep -i 'oom'
sudo grep -i 'killed process' /var/log/messages
-
인스턴스의 메모리 사용량을 모니터링하려면 다음 명령을 실행합니다.
watch -n 1 free -m
-
사용 가능한 메모리 페이지를 확인하려면 다음 명령을 실행합니다.
cat /proc/buddyinfo
자세한 내용은 Amazon EC2 인스턴스 유형을 참조하십시오.
Java 애플리케이션에 메모리 누수가 있음
다음 단계를 완료하십시오.
- 힙 크기를 조정하려면 다음 명령을 실행합니다.
java -Xms2g -Xmx4g -jar application.jar
참고: 2g와 4g를 애플리케이션의 최소 및 최대 힙 크기로 바꾸십시오.
- 폐영역 회수(GC) 로깅을 활성화하려면 다음 명령을 실행합니다.
java -Xlog:gc*=debug:file=gc.log -jar application.jar
참고: gc.log를 로그 파일 이름 및 경로로 바꾸십시오.
- G1 폐영역 수집기를 사용하여 인스턴스 메모리를 효율적으로 관리하려면 다음 명령을 실행합니다.
java -XX:+UseG1GC -jar application.jar
참고: -XX:+UseG1GC를 원하는 폐영역 회수 알고리즘으로 바꾸십시오.
데이터베이스 서버에 문제가 있음
다음 단계를 완료하십시오.
-
특정 데이터베이스 서버 프로세스를 모니터링하려면 다음 명령을 실행합니다.
ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
-
InnoDB 버퍼 풀 사용량을 확인하려면 다음 명령을 실행합니다.
mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
-
각 연결의 메모리 사용량을 분석하려면 다음 명령을 실행합니다.
mysql -e "SHOW VARIABLES LIKE '%buffer%';"
데이터베이스 서버 성능을 최적화하는 방법에 대한 자세한 내용은 MySQL 작업 모범 사례를 참조하십시오.
관련 정보
CloudWatch 에이전트를 사용하여 지표, 로그 및 추적 수집