Loading the catalog…
Loading the catalog…
PostgreSQL 성능 튜닝 - PGTune으로 설정값 점검하기 PostgreSQL을 운영하면서 DB 성능과 관련된 설정값을 확인할 일이 있었다. 처음에는 PostgreSQL의 설정값을 하나씩 찾아보면서 적절한 값을 직접 설정해야 하나 싶었는데, 서버의 CPU나 메모리, 저장장치 등의 환경에 따라 적절한 설정값이 달라질 수 있다는 것을 알게 되었다. 그러던 중 PostgreSQL 서버 환경을 입력하면 적절한 설정값을 제안해주는 PGTune 이라는 도구를 알게 되었다. 이번 글에서는 PGTune을 사용하기 전에 왜 PostgreSQL 설정값을 튜닝해야 하는지 , 그리고 PGTune에 입력하는 값들이 어떤 의미를 가지고 있는지 정리해보려고 한다. 1. PostgreSQL 튜닝이 필요한 이유 PostgreSQL에는 데이터베이스의 동작 방식을 조절할 수 있는 다양한 설정값이 존재한다. 예를 들어 다음과 같은 설정들이 있다. shared_buffers work_mem maintenance_work_mem effective_cache_size max_connections random_page_cost effective_io_concurrency 이러한 값들은 메모리 사용량이나 쿼리 처리, 디스크 I/O, 데이터베이스 연결 수 등에 영향을 준다. 문제는 모든 서버에 동일한 설정값을 적용할 수 없다는 것 이다. 예를 들어 RAM이 8GB인 서버와 64GB인 서버에서 PostgreSQL을 운영한다면 동일한 메모리 관련 설정값을 사용하는 것이 적절하지 않을 수 있다. CPU의 수나 저장장치의 종류 역시 서버마다 다르다. 따라서 PostgreSQL을 운영하는 서버의 환경을 확인하고 그에 맞게 설정값을 조정할 필요가 있다. 2. PGTune이란? PGTune 은 PostgreSQL이 실행되는 서버의 환경과 데이터베이스 사용 목적 등을 입력하면 PostgreSQL의 설정값을 제안해주는 도구다. 서버의 하드웨어 환경뿐만 아니라 데이터베이스의 용도와 연결 수 등을 함께 입력할 수 있기 때문에 PostgreSQL 설정을 처음 점검할 때 참고하기 좋다. 다만 PGTune에서 생성한 값을 그대로 적용하면 무조건 성능이 좋아지는 것은 아니다. 실제 데이터베이스에서는 쿼리의 특성이나 데이터의 크기, 동시 접속 수, 인덱스 구성 등 다양한 요소가 성능에 영향을 주기 때문이다. 그래서 이번에는 PGTune을 최적의 값을 자동으로 찾아주는 도구라기보다는 현재 설정을 점검하고 튜닝 방향을 잡기 위한 참고 도구 로 사용했다. 3. PGTune에 어떤 정보를 입력할까? PGTune에서는 PostgreSQL 서버 환경을 입력해야 한다. 내가 사용한 환경은 다음과 같았다. 항목 입력값 DB Version PostgreSQL 11 OS Type Windows DB Type Desktop Application Total Memory 서버의 실제 RAM Number of CPUs 서버의 논리 프로세서 수 Number of Connections 1000 Data Storage SSD Total Data Size 실제 DB 크기에 맞게 선택 각 항목이 왜 필요한지 하나씩 확인해보았다. 4. DB Version DB Version 현재 사용하고 있는 PostgreSQL의 버전을 입력한다. PostgreSQL 버전에 따라 사용할 수 있는 기능이나 기본 설정 등이 달라질 수 있기 때문에 현재 사용 중인 버전을 기준으로 입력해야 한다. 현재 PostgreSQL 버전은 다음과 같이 확인할 수 있다. SELECT version(); 내가 사용하고 있던 PostgreSQL은 11 버전 이었다. 5. OS Type OS Type PostgreSQL이 설치되어 실행되고 있는 운영체제를 선택한다. 내 환경은 Windows 였기 때문에 Windows를 선택했다. 여기서 중요한 것은 PostgreSQL에 접속하는 클라이언트의 운영체제가 아니라 PostgreSQL 서버가 실행되는 운영체제 를 기준으로 해야 한다는 것이다. 예를 들어 Windows PC에서 Linux 서버의 PostgreSQL에 접속하고 있다면 Linux를 선택해야 한다. 6. DB Type DB Type PostgreSQL을 어떤 용도로 사용하는지 선택하는 항목이다. PGTune에서는 데이터베이스의 사용 형태에 따라 여러 유형을 제공한다. Web Application Online Transaction Processing (OLTP) Data Warehouse (DW) Desktop Application Mixed Type of Applications 내가 사용하던 환경에서는 Desktop Application 을 선택했다. 단순히 애플리케이션이 웹 기반인지 아닌지만 보고 선택하기보다는 실제 데이터베이스가 어떤 방식으로 사용되고 있는지를 기준으로 선택하는 것이 좋다. 7. Total Memory Total Memory (RAM) PostgreSQL 서버가 사용하는 전체 RAM 용량 을 입력한다. 메모리는 PostgreSQL의 여러 설정값과 직접적으로 관련되어 있다. 예를 들어 shared_buffers 는 PostgreSQL이 데이터 페이지를 캐싱하는 데 사용하는 메모리와 관련된 설정이고, work_mem 역시 쿼리 처리 과정에서 사용되는 메모리와 관련이 있다. 따라서 서버의 메모리 크기를 모른 상태에서 적절한 값을 설정하기는 어렵다. Windows에서는 다음과 같이 확인할 수 있다. 작업 관리자 → 성능 → 메모리 여기에서 실제 PostgreSQL 서버의 RAM을 확인해서 입력하면 된다. 8. Number of CPUs Number of CPUs 처음 PGTune을 사용할 때 조금 헷갈렸던 항목이다. 여기서 단순히 물리적인 CPU 코어 수를 입력하는 것은 아니다. 운영체제에서 인식하는 논리적인 CPU 실행 단위를 기준으로 생각할 수 있다. Windows에서는 작업 관리자의 CPU 정보에서 다음과 같은 항목을 확인할 수 있다. 코어 논리 프로세서 예를 들어 다음과 같은 CPU라면, 코어: 4 논리 프로세서: 8 PGTune의 Number of CPUs 에는 일반적으로 8 을 입력한다. 왜 CPU 개수가 필요할까? PostgreSQL은 쿼리를 처리하면서 CPU를 사용한다. 따라서 서버가 사용할 수 있는 CPU 자원이 얼마나 되는지를 알아야 CPU와 관련된 작업이나 메모리, 병렬 처리 등에 영향을 주는 설정값을 서버 환경에 맞춰 제안할 수 있다. 특히 하나의 물리 코어가 여러 개의 논리 프로세서로 인식되는 환경에서는 물리 코어 수와 운영체제가 인식하는 CPU 실행 단위의 수가 다를 수 있다. 예를 들어, 물리 코어 4개 ↓ 하이퍼스레딩 적용 ↓ 논리 프로세서 8개 와 같은 환경이라면 운영체제에서는 8개의 논리 프로세서를 사용할 수 있는 것으로 인식한다. 그래서 PGTune의 CPU 입력값을 확인할 때는 단순히 "코어가 몇 개인가?"만 확인하는 것이 아니라 운영체제에서 CPU가 어떻게 인식되고 있는지도 확인할 필요가 있다. Windows에서는 작업 관리자 → 성능 → CPU → 논리 프로세서 에서 확인할 수 있다. 9. Number of Connections Number of Connections PostgreSQL에 허용할 최대 연결 수를 입력한다. PostgreSQL에서는 max_connections 설정으로 최대 연결 수를 지정한다. 현재 설정값은 다음과 같이 확인할 수 있다. SHOW max_connections; 내가 사용하던 환경에서는 최대 연결 수가 1000 으로 설정되어 있었다. max_connections = 1000 여기서 주의할 점은 최대 연결 수와 현재 연결되어 있는 세션 수는 다르다는 것 이다. max_connections 는 PostgreSQL이 허용할 수 있는 최대 연결 수를 의미한다. 연결 수가 많아지면 PostgreSQL이 사용할 수 있는 메모리에도 영향을 줄 수 있기 때문에 서버 환경과 애플리케이션의 실제 연결 구조를 함께 확인해야 한다. 10. Data Storage Data Storage PostgreSQL의 데이터가 저장되는 저장장치의 종류를 선택한다. 대표적으로 SSD나 HDD 등을 선택할 수 있다. 내가 사용하던 서버의 데이터 저장장치는 SSD 였기 때문에 SSD를 선택했다. 저장장치의 속도는 PostgreSQL의 디스크 I/O 성능과 관련이 있기 때문에 이 정보 역시 설정값을 계산할 때 고려할 필요가 있다. 11. Total Data Size Total Data Size PostgreSQL에서 사용하는 데이터의 크기를 서버의 RAM과 비교해서 선택하는 항목이다. 예를 들어 서버의 RAM이 16GB이고 데이터베이스의 전체 크기가 수백 GB라면 데이터베이스의 크기가 RAM보다 큰 환경이라고 볼 수 있다. 반대로 데이터베이스가 RAM보다 훨씬 작은 환경이라면 다른 조건을 선택하게 된다. 이처럼 데이터베이스의 크기와 서버 메모리의 관계 역시 PostgreSQL의 캐시 및 I/O 관련 설정을 결정할 때 고려할 수 있는 요소다. 12. PGTune 결과 확인 모든 정보를 입력하면 PGTune에서 PostgreSQL 설정값을 생성할 수 있다. 결과에는 다음과 같은 설정값들이 포함된다. max_connections = ... shared_buffers = ... effective_cache_size = ... maintenance_work_mem = ... checkpoint_completion_target = ... wal_buffers = ... default_statistics_target = ... random_page_cost = ... effective_io_concurrency = ... work_mem = ... 여기서 바로 설정 파일을 수정하지 않고 현재 PostgreSQL의 설정값과 먼저 비교 해보았다. 13. 현재 PostgreSQL 설정 확인하기 PostgreSQL의 설정값은 SHOW 명령어를 이용해서 확인할 수 있다. SHOW shared_buffers; SHOW effective_cache_size; SHOW maintenance_work_mem; SHOW work_mem; SHOW max_connections; 여러 설정을 한 번에 확인하고 싶다면 pg_settings 를 사용할 수도 있다. SELECT name, setting, unit FROM pg_settings WHERE name IN ( 'max_connections', 'shared_buffers', 'effective_cache_size', 'maintenance_work_mem', 'work_mem', 'random_page_cost', 'effective_io_concurrency' ) ORDER BY name; 이렇게 확인한 현재 설정값과 PGTune에서 제안한 값을 비교한다. 현재 PostgreSQL 설정 ↓ PGTune 추천값 확인 ↓ 차이가 있는 설정 확인 ↓ 각 설정이 어떤 영향을 주는지 확인 ↓ 실제 환경에 적용할지 판단 14. PGTune의 값을 그대로 적용하면 될까? 여기서 가장 중요한 부분이다. PGTune에서 생성된 값을 그대로 적용한다고 해서 무조건 성능이 좋아지는 것은 아니다. 예를 들어 work_mem 의 경우 값을 크게 설정하면 하나의 작업에서 사용할 수 있는 메모리가 증가할 수 있지만, 여러 쿼리가 동시에 실행되면 전체 메모리 사용량이 증가할 수 있다. max_connections 역시 마찬가지다. 내 환경에서는 최대 연결 수가 1000 으로 설정되어 있었는데, 단순히 연결 수를 크게 설정하는 것이 항상 좋은 것은 아니다. 실제로는 애플리케이션의 연결 방식과 동시 접속 상황 등을 함께 확인해야 한다. 따라서 PGTune의 결과를 보고 "추천값이 나왔으니 그대로 적용한다." 보다는 "현재 설정과 어떤 차이가 있는지 확인하고, 왜 이런 값이 추천되었는지 이해한 후 적용한다." 는 방식으로 접근하는 것이 좋다고 생각한다. 마무리 이번에는 실제 운영 중인 PostgreSQL 환경을 기준으로 PGTune을 사용해 설정값을 점검해보았다. 내 환경은 다음과 같았다. Windows Desktop Application SSD max_connections = 1000 PGTune을 사용하면서 PostgreSQL의 설정값은 단순히 임의의 숫자를 지정하는 것이 아니라 CPU, 메모리, 저장장치, 데이터베이스 크기, 연결 수와 같은 서버 환경을 함께 고려해서 설정해야 한다는 것 을 알 수 있었다. 특히 PGTune은 설정값을 자동으로 최적화해주는 도구라기보다는, 현재 환경에서 어떤 설정을 확인하고 조정해볼 수 있는지 방향을 잡는 데 유용한 도구라고 생각한다. 다음에는 PGTune에서 생성된 설정값 중 실제로 많이 사용되는 shared_buffers , work_mem , effective_cache_size 등이 각각 어떤 역할을 하는지 조금 더 자세히 정리해볼 예정이다.
What RADAR observed and classified to build this opportunity. It is what the source published, not a verification that the offer is still active.
PostgreSQL 성능 튜닝 - PGTune으로 설정값 점검하기. PostgreSQL 성능 튜닝 - PGTune으로 설정값 점검하기 PostgreSQL을 운영하면서 DB 성능과 관련된 설정값을 확인할 일이 있었다. 처음에는 PostgreSQL의 설정값을 하나씩 찾아보면서 적절한 값을 직접 설정해야 하나 싶었는데, 서버의 CPU나 메모리, 저장장치 등의 환경에 따라 적절한 설정값이 달라질 수 있다는 것을 알게 되었다. 그러던 중 PostgreSQL 서버 환경을 입력하면 적절한 설정값을 제안해주는 PGTune 이라는 도구를 알게 되었다. 이번 글에서는 PGTune을 사용하기 전에 왜 PostgreSQL 설정값을 튜닝해야 하는지 , 그리고 PGTune에 입력하는 값들이 어떤 의미를 가지고 있는지 정리해보려고…
Open source