내용으로 건너뛰기

EC2 Linux 인스턴스의 높은 메모리 사용량 문제를 해결하려면 어떻게 해야 합니까?

4분 분량
0

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

메모리 사용 패턴에 따라 문제 해결

인스턴스의 스왑 사용률이 높음

다음 단계를 완료하십시오.

  1. 스왑 활용도를 줄이려면 다음 명령을 실행합니다.

    sudo sysctl vm.swappiness=10
  2. 스왑을 지우려면 다음 명령을 실행합니다.

    # 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) 오류가 발생할 수 있습니다.

  3. 인스턴스에 더 많은 공간이 필요한 경우 다음 명령을 실행합니다.

    sudo dd if=/dev/zero of=/swapfile bs=1G count=8

시스템 전반의 메모리 문제가 있음

다음 단계를 완료하십시오.

  1. 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
  2. 인스턴스의 메모리 사용량을 모니터링하려면 다음 명령을 실행합니다.

    watch -n 1 free -m
  3. 사용 가능한 메모리 페이지를 확인하려면 다음 명령을 실행합니다.

    cat /proc/buddyinfo

자세한 내용은 Amazon EC2 인스턴스 유형을 참조하십시오.

Java 애플리케이션에 메모리 누수가 있음

다음 단계를 완료하십시오.

  1. 힙 크기를 조정하려면 다음 명령을 실행합니다.
    java -Xms2g -Xmx4g -jar application.jar
    참고: 2g4g를 애플리케이션의 최소 및 최대 힙 크기로 바꾸십시오.
  2. 폐영역 회수(GC) 로깅을 활성화하려면 다음 명령을 실행합니다.
    java -Xlog:gc*=debug:file=gc.log -jar application.jar
    참고: gc.log를 로그 파일 이름 및 경로로 바꾸십시오.
  3. G1 폐영역 수집기를 사용하여 인스턴스 메모리를 효율적으로 관리하려면 다음 명령을 실행합니다.
    java -XX:+UseG1GC -jar application.jar
    참고: -XX:+UseG1GC를 원하는 폐영역 회수 알고리즘으로 바꾸십시오.

데이터베이스 서버에 문제가 있음

다음 단계를 완료하십시오.

  1. 특정 데이터베이스 서버 프로세스를 모니터링하려면 다음 명령을 실행합니다.

    ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
  2. InnoDB 버퍼 풀 사용량을 확인하려면 다음 명령을 실행합니다.

    mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
  3. 각 연결의 메모리 사용량을 분석하려면 다음 명령을 실행합니다.

    mysql -e "SHOW VARIABLES LIKE '%buffer%';"

데이터베이스 서버 성능을 최적화하는 방법에 대한 자세한 내용은 MySQL 작업 모범 사례를 참조하십시오.

관련 정보

CloudWatch 에이전트를 사용하여 지표, 로그 및 추적 수집

AWS 공식업데이트됨 일 년 전