본문 바로가기

Cloud/Middleware

[MariaDB] Too many open files 조치 방법

다중화된 MariaDB를 운영 중이고, Maxscale을 Proxy로 구성하여 운영 중이다.

 

개발자분이 저녁에 배포할 때 마다, 컨테이너를 롤아웃하면 Maxscale이 재시작하는 경우가 종종 있었다.

늘 그러는 것도 아니고 가끔씩ㅠㅠ 조치가 필요했다. DB 담당 시작한지 1년도 안 되었는데요..

 

 

[ 구성 정보 ]

Red Hat 7

MariaDB 10.3

Maxscale 2.4

 

 

증상 1.

항상 Too many open files 라는 로그를 연속으로 내뱉다가 죽었다.

MariaDB는 죽지 않고 앞단의 Maxscale(DB Proxy)이 죽어서, 로그도 Maxscale에만 찍혀있다.

 

 

 

 

 

증상 2.

컨테이너를 롤아웃하면 DB Connection이 평소의 약 4배는 껑충 뛰었다.

평소에 사용자 많을 때에도 DB Connection은 300개가 좀 안된다. 이것 때문에 그럴 가능성이 농후

 

나한테 왜 그러는건데

 

 

 


 

난 당연히 Maxscale이 수용 가능한 DB Connection 수를 초과했나보다~ 하고 찾아보기 시작

 

 

https://mariadb.com/kb/en/mariadb-maxscale-24-mariadb-maxscale-configuration-guide/#max_connections

 

근데 우리 Maxscale은 max_connections 옵션이 적용되어 있지 않고..

Maxscale 공식 문서에는 적용 안되어 있을 경우, 제한이 없다고 나와 있다. 읭?

 

그리고 생각해보니 로그 내용이

'Too many connections' 이 아니라 'Too many open files' ... 헉

 

OS 를 왜 안 봤지!??

 

 

 

 

1. Too many open files 조치법 (Linux)

 

1610517보다 낮아야 하는 ulimit

 

하나의 계정(user)에 할당되는 자원을 ulimit 이라고 하고, ulimit은 2가지가 있다.

 

  1) Soft

  - 쉘의 현재 설정 값

  - root 계정이 아니여도 변경 가능

  - Hard 보다 값이 높을 수 없다.

 

  2) Hard

  - 쉘의 최대 값

  - root 계정으로만 변경 가능

  - 절대 넘을 수 없다. 넘길 경우, Too many open files 발생

 

 

이 값을 늘려야 한다.

얼마나 늘릴지는 개인의 환경따라 다르므로 이 부분은 내부에서 검토해봐야 한다.

 

우선 지금 서버 내에 열린 파일 제한이 약 65000개이고, 난 120000개로 늘려주려 한다.

메모리 4MB 당 256개의 파일을 볼 수 있다고 하니, 저렇게 늘려줘도 메모리는 약 1GB 남짓 늘어날 것으로 예상

 

 

 

[ OS ulimit 늘리는 방법 ]

  1) 영구 적용

  - /etc/security/limit.conf 파일 안의 구문 수정

   -> root  hard  nofile  65535  // 65535 값을 변경

   -> root  soft  nofile  65535   // 65535 값을 변경

  - 세션 종료 후 재 로그인해야 적용됨

 

  2) 일시 적용 

  - ulimit -n 120000    // 변경하려는 값으로 적용

  - ulimit -a 로 확인 가능

  - 즉시 적용 되지만, 서버 재시작 시 풀림

 

 

난 경유지인 Maxscale과 실제 MariaDB의 운영체제 설정을 모두 변경했다.

 

 

 

 

프로세스의 limit도 늘려줘야 한다. (프로세스 재시작 안하는 방향으로)

 

 

[ 프로세스 limit 늘리는 방법 ]

 # ps -ef | grep maxscale

    // 프로세스의 PID 확인

 

 # prlimit --nofile --output RESOURCE,SOFT,HARD --pid [PID 번호]

    // PID 기준으로 프로세스의 limit 확인

 

 # prlimit --nofile=500000 --pid=[PID 번호]

    // 프로세스 재시작 없이 적용

 

이 부분도 maria 프로세스, maxscale 프로세스 모두 늘려주었다.

 

 

 

 

 

2. Too many open files 조치법 (MariaDB)

 

현재 open_files 값 확인하는 방법

 

OS 뿐만 아니라, MariaDB의 limit 값도 확인해줘야 한다.

사실 Maxscale만 늘려줘도 될 것 같지만, 결국 최종 목적지는 MariaDB이니까 불안해서 같이 챙겨봄ㅎㅎ

 

단, MariaDB는 설정 파일을 수정해야 해서 DB 재시작이 필요하다.

평소 운영 시에는 대부분 못할 경우가 많을테고 PM 작업 때 하면 된다. 당장 하고 싶다

 

[MariaDB limit 값 늘리는 방법]

 # vi /etc/my.cnf

 --> open_files_limit = 65535  // 65535 값을 변경

 

# systemctl restart mariadb  // MariaDB 재시작. 재시작 시에 반영됩니다 ~

 

 

 

 

 

사실 값을 좀 더 높게 해주고 싶었는데

MariaDB를 재시작할 수 없는 상황이여서 급하게 안정적인 선에서 최대치로 늘려주었다.

 

이제 당분간은 모니터링 시작이다 !!

결과는 추후에 포스팅 수정할 예정 ㅋ_ㅋ 장애만 나지 말아라..

 

 

 

 


 

 

2024. 05 - 약 한달 +a 지난 후

 

2~3번의 배포(컨테이너 롤아웃)이 있었는데도 Maxscale은 한 번도 죽지 않았다. 오예 ~