본문 바로가기

소프트웨어-이야기/데이터 저장소 + 시각화

(PostgreSQL) work_mem 메모리 설정


postgresql의 work_mem이란?

이 값은 정렬 /  해시 / 조인 등의 동작에 사용될 수 있는 메모리 사용량을 의미한다.  

이 메모리는 임시 디스크에 데이터를 쓰기 전에 사용된다. 

기본값은 4MB으로 설정된다. 그런데 어떤 아티클에서는 일반적으로 64MB 정도가 적합한 수치라고 한다. 

만약 PostgreSQL이 temporary file을 사용하고 있다면, work_mem을 늘리면 좋다. 


work_mem은 한 쿼리에서 사용되는 메모리 양을 의미하는게 아니다.

정렬 / 해시 / 조인 작업이 한 쿼리에서 동시에 일어날 수 있기 때문에, 각각의 동작에서 사용할 수 있는 메모리 수치를 의미한다. 


만약 10GB짜리 데이터베이스를 쓴다고 가정해보자.

기본적으로 10MB씩 사용하는 커넥션이 100개가 있다고 생각했을 때, 메모리 사용량은 100 * 10MB (1GB)다.

그러면 9GB가 남아보인다고, 90MB으로 work_mem을 설정하면 안된다. 


work_mem을 너무 크게 잡아도 문제가 된다. 

만약 한 프로세스가 메모리를 1GB 정도씩 잡아다 쓰는데, work_mem이 2GB으로 잡혀있다면, 문제가 될 수 있다. 
이렇게 되면 프로세스를 10개밖에 못띄우게 되는거고, 만약 이마저도 다 써버리면 서버에서 Out Of Memory 에러가 발생할 수도 있다.

즉, 서버가 고장난다. 

만약 Postgres Log에 Out Of Memory가 나면, OOM Killer가 메모리를 만들어주려고 여기저기 프로세스를 죽이고 다닌다. 


그래서 out of memory 에러를 발견하면 서버의 RAM을 높이던가, work_mem 사이즈를 줄여야한다. 


참고 

Configuring memory for Postgres 

DatabaseError: SSL SYSCALL error: EOF detected (Intermitten