문서번호 : 11-200427
1) LINUX VM 설정
노드 배포과정에 Kernel memory 설정을 일부 자동 수정합니다. 또한 sdb-report 명령어 등을 통해 설정 값을 검증하는 절차를 제공합니다.
아래는 여러 단계로 나뉘어져 있는 메모리 설정 대상의 확인방법과 설정 절차를 한 곳에 통합한 것으로 수동 설정시 참조할 수 있습니다. 수동 설정시 Cluster의 모든 노드에서 수행합니다.
## 설정 확인
sysctl -a | egrep "vm.max_map_count|vm.min_free_kbytes|vm.overcommit_memory|vm.overcommit_ratio|vm.swappiness"
vm.max_map_count = 1000000000
vm.min_free_kbytes = 67584
vm.overcommit_memory = 0
vm.overcommit_ratio = 50
vm.swappiness = 30
## 설정 변경
vi /etc/sysctl.conf
# 파일에 다음 라인 추가
# 10 억; 프로세스가 가질수 있는 최대 메모리 맵; 65536:default
vm.max_map_count=1000000000
# 메모리 반환 임계치; RAM 의 1% 또는 4G 중 작은 값, 예) 16G x 1%
vm.min_free_kbytes=162339
# 0; 메모리 overcommit 설정; 0:휴리스틱(default), 1:항상, 2:제한적(ratio 설정)
vm.overcommit_memory=0
# 99; vm.overcommit_memory=2 일때만 설정 필요, 아닌 경우 무시됨
vm.overcommit_ratio=99
# 0~10(권장);스왑 활용도; 0:미활용,60:default,100:적극활용
vm.swappiness=10
## 설정 적용 및 재부팅시 영구 적용됨
sysctl -p /etc/sysctl.conf
Bash
복사
2) NUMA 활성화
클러스터 배포 수행 후 하나의 호스트에 멀티 Leaf 노드 구성하기 위해 설정합니다.
※ 다중 NUMA(Non-Uniform Memory Access) 노드가 있는 시스템에서 SingleStore DB 를 실행할 때 최적의 성능을 위해 numactl 을 사용하여 NUMA 용 SingleStore DB 를 구성해야 합니다. 이 방법으로 SingleStore DB 를 구성하지 않으면 값비싼 NUMA 노드 간 메모리 액세스로 인해 성능이 크게 저하됩니다. NUMA 구성은 설치 프로세스의 일부로 수행해야 합니다. 그러나 필요한 경우 나중에 배포를 재구성할 수 있습니다.
•
구성 절차
1.
numactl 패키지 설치
2.
NUMA 노드 수 확인
3.
NUMA 노드 수만큼 SingleStore Leaf 노드 배포
4.
sdb-admin optimize 실행
# 1. numactl 패키지 설치
# Redhat/CentOS 기반
sudo yum install numactl
# 2. NUMA 노드 수 확인
numactl -H
available: 1 nodes (0)
# 3. NUMA 노드 수만큼 SingleStore Leaf 노드 배포
sdb-admin create-node ... 사용
sdb-admin add-leaf ... 사용
# 4. sdb-admin optimize 실행
sdb-admin optimize
Bash
복사
3) LINUX ulimit 설정 & unlimit 파일 오픈 및 최대 프로세스 제한 증가
[주의]
✓ 현재 설정을 확인하려면 SingleStore DB 를 기동하는 유저(memsql)로 로그인해야 합니다.
✓ 설치 방법에 따라 설치 유저로 로그인이 제한될 수 있습니다. ulimit 명령어 대신 설정파일을 직접 확인합니다.
✓ 변경된 ulimit 설정을 적용하려면 SingleStore DB 노드를 다시 시작해야 합니다.
✓ 설정 값이 작은 경우만 설정 변경이 필요합니다.
•
대부분의 Linux 운영 체제는 개별 사용자 또는 프로세스 수준에서 스레드, 파일 및 네트워크와 같은 시스템 리소스의 사용을 제어하는 방법을 제공합니다. 리소스에 대한 사용자 별 제한을 ulimits 라고하며 단일 사용자가 너무 많은 시스템 리소스를 소비하는 것을 방지합니다. 최적의 성능을 위해 SingleStore 는 ulimits 를 기본 Linux 설정보다 높은 값으로 설정할 것을 권장합니다. ulimit 설정은 /etc/security/limits.conf 파일에서 구성하거나 쉘 명령을 통해 직접 구성할 수 있습니다.
•
SingleStore 는 Aggregator 와 Leaf 간 많은 수의 서버-클라이언트 연결을 사용하여 쿼리 및 클러스터 작업을 실행합니다. 이러한 연결을 위하 설정과 최대 프로세스 제한을 늘리지 않으면 성능이 크게 저하되거나, 연결 제한 오류가 발생할 수 있습니다. 모든 노드가 대상입니다.
◦
open files : 한 프로세스에서 열수 있는 파일 및 네트워크 연결 최대 개수
◦
max user processes : 단일 사용자의 프로세스/쓰레드 최대 개수
## 설정 확인
ulimit -n -u
open files (-n) 1024
max user processes (-u) 15037
## 설정 변경 : 현재 값보다 작을 경우 설정 추가
vi /etc/security/limits.conf
# 다음 설정 추가
<user> - nofile 1024000
<user> - nproc 128000
## 적용 : 해당 노드 재기동
# ※ 모든 노드의 호스트를 변경한 후 일괄 재기동이 편리합니다.
# 해당 노드 restart
sdb-admin restart-node --memsql-id <memsql_id>
## 참고, 모든 노드 적용 후 전체 restart 수행
sdb-admin restart-node --all
Bash
복사
4) ulimit nice 설정
[주의]
✓ 현재 설정을 확인하려면 SingleStore DB 를 기동하는 유저(memsql)로 로그인해야 합니다.
✓ 설치 방법에 따라 설치 유저로 로그인이 제한될 수 있습니다. ulimit 명령어 대신 설정파일을 직접 확인합니다.
✓ 변경된 ulimit 설정을 적용하려면 SingleStore DB 노드를 다시 시작해야 합니다.
✓ CPU 사용률이 높은 클러스터에서 권장됩니다.
•
SingleStore DB 엔진이 가비지수집(Garbage Collector = GC) 스레드와 같은 일부 스레드를 높은 우선순위로 실행할 수 있도록 합니다. CPU 가 부족한 클러스터에서도 삭제된 데이터를 빠르게 해제될 수 있도록 하여 불필요한 메모리 사용을 줄일 수 있습니다.
## 설정 확인
ulimit -e # 기본값: 0
0
## 설정 변경
vi /etc/security/limits.conf
# 다음 설정을 추가
<user_id> - nice -10
## 적용: 해당 노드 재기동
# ※ 모든 노드의 호스트를 변경한 후 일괄 재기동이 편리합니다.
# 해당 노드 restart
sdb-admin restart-node --memsql-id <memsql_id>
## 참고, 모든 노드 적용 후 전체 restart 수행
sdb-admin restart-node --all
Bash
복사
5) NVMe 설정
이 설정은 SingleStore 가 온-프레미스(On-premise) 로 구성되고 노드가 NVMe 를 사용할 때,
Columnstore 성능을 위한 권장 사항입니다.
※ SingleStore 는 EXT4 및 XFS 파일 시스템을 지원합니다. 또한 최근 NVMe 장치 용 Linux 에서 많은 기능이 향상되었으므로 3.0 이상의 커널을 사용하는 것이 좋습니다(예, CentOS 7.2 는 3.10 커널). 설치 위치의 디스크가 NVMe 장치인 경우 다음과 같이 최적화 하시기 바랍니다. 각 장치의
<장치번호>는 확인된 값을 넣으십시오.
## 설정 변경 (영구) : 주의, 부팅될 때 실행되는 스크립트이므로 별도 적용 필요
# 파일에 다음 명령문 추가
echo 0 > /sys/block/nvme<장치번호>n1/queue/add_random
echo 1 > /sys/block/nvme<장치번호>n1/queue/rq_affinity
echo none > /sys/block/nvme<장치번호>n1/queue/scheduler
echo 1023 > /sys/block/nvme<장치번호>n1/queue/nr_requests
## 적용: 각 명령라인 실행
sudo "echo 0 > /sys/block/nvme<장치번호>n1/queue/add_random"
sudo "echo 1 > /sys/block/nvme<장치번호>n1/queue/rq_affinity"
sudo "echo none > /sys/block/nvme<장치번호>n1/queue/scheduler"
sudo "echo 1023 > /sys/block/nvme<장치번호>n1/queue/nr_requests"
Bash
복사
6) SWAP 공간 생성
SingleStore 는 RAM 을 광범위하게 사용하므로 메모리가 부족한 경우 OS 가 SingleStore 를 강제종료 시킬 수 있습니다. 이를 완화하기 위해 swap 공간(파티션 또는 파일)을 만드는 것이 좋습니다. SingleStore 머신은 많은 양의 RAM(32G 이상)이 있으므로 실제 swap 공간이 작을 수 없습니다(물리 RAM 의 10%이상). 모든 노드가 대상입니다.
## 설정 확인
sudo swapon --show # 설정되지 않은 경우 출력 내용 없음
free -h
total used free shared buff/cache available
Mem: 3.7G 879M 1.2G 8.6M 1.6G 2.3G
Swap 0B 0B 0B
## 설정 변경 : RAM 의 10%이상 권장
# ex) 4G swap 파일 추가 (사이즈, 파일명/경로는 변경가능)
sudo dd if=/dev/zero of=/swap01 bs=1MiB count=4096
sudo chmod 600 /swap01
## swap 영역 생성
sudo mkswap /swap01
## 즉시 적용
sudo swapon /swap01
## 영구 적용
sudo vi /etc/fstab
# 다음 설정 추가
/swap01 swap swap defaults 0 0
## 참고 : 제거 적용
sudo swapoff /swap01
# /etc/fstab 에서 해당 설정 제거
Bash
복사
7) THP(Transparent Huge Pages) 비활성화
비활성화 되어 있지 않을 경우 쿼리 실행 시간이 일관되지 않을 수 있습니다. 모든 노드가
대상입니다
※ Linux 는 RAM 을 기본으로 4KB 크기의 페이지를 구성합니다. THP 를 사용하면 2MB 크기 이상의 페이지를 사용할 수 있습니다. 백그라운드 프로세스로서 THP 는 작은 페이지를 거대한 페이지로 병합하거나 몇 개의 거대한 페이지를 작은 페이지로 분할하여 커널 내부의 프로세스에서 사용하는 메모리를 투명하게 재구성합니다. 이로 인해 몇 초 동안 메모리 관리자의 메모리 사용이 차단되고 프로세스가 메모리에 액세스하지 못할 수 있습니다. SingleStore DB 는 많은 메모리를 사용하므로 클러스터의 모든 노드에서 부팅 시 THP 를 비활성화 하는 것이 좋습니다. THP 지연으로 인해 쿼리 실행 시간이 일관되지 않거나 시스템 CPU 가 높아 질 수 있습니다.
## 설정 확인
# never 인지 확인
sudo cat /sys/kernel/mm/transparent_hugepage/{enabled,defrag}
[always] madvise never # 활성화된 상태일 때
always madvise [never] # 비활성화된 상태일 때
## 임시 비활성화 : 현재 런타임에서 만 비활성화
sudo bash -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
sudo bash -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
## 영구 비활성화 방법 : 주의, 부팅시 비활성화되는 것이므로 리부팅 필요
# 설정파일 편집
sudo vi /etc/default/grub
# 다음 설정의 끝에 transparent_hugepage=never 추가
GRUB_CMDLINE_LINUX="<이전설정> transparent_hugepage=never"
# 실 설정 필드: 수정한 정보를 /boot/grub/grub.cfg 파일에 반영함
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# 시스템 리부팅
sudo shutdown -r now
## 만약 비활성화 되지 않을 경우 tuned 데몬 설정을 변경해야 합니다.
# 데몬 확인
sudo systemctl status tuned
# 설정파일 편집
sudo mkdir /etc/tuned/transparent_hugepage
# 설정 파일 생성
sudo vi /etc/tuned/transparent_hugepage/tuned.conf
[main]
include= throughput-performance
[vm]
transparent_hugepages=never
# 설정 파일에 실행(x) 권한 부여
sudo chmod +x /etc/tuned/transparent_hugepage/tuned.conf
# transparent_hugepage 프로파일 활성화
sudo tuned-adm profile transparent_hugepage
# 프로파일 활성화 확인
tuned-adm active
Bash
복사
8) cgroup 관련 설정 비활성화 (비 VM 배포일 경우)
VM 이 아닌 배포의 경우 cgroups 관련하여 다음과 같이 비활성화 합니다. 다음 인수를 사용하여
커널을 실행하십시오.
•
intel_pstate=disable : 커널의 CPU 성능 확장 서브시스템 비활성화
•
cgroup_disable=memory : 메모리 리소스에 대한 cgroup 비활성화
## 설정 확인
grep memory /proc/cgroups
memory 0 111 1 <- 끝의 값이 1 이면 enable 된 상태
## 설정 변경(비활성화)
# 설정파일 편집
sudo vi /etc/default/grub
# 다음 설정의 끝에 intel_pstate=disable cgroup_disable=memory 추가
GRUB_CMDLINE_LINUX="<이전설정> intel_pstate=disable cgroup_disable=memory"
# 실 설정 필드: 수정한 정보를 /boot/grub/grub.cfg 파일에 반영함
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
## 설정
# 시스템 리부팅
sudo shutdown -r now
Bash
복사
9) 표준시간대를 KST 로 설정 (선택)
## 확인
timedatectl | grep Local
Local time: Tue 2022-04-26 18:54:45 KST
## 변경
sudo timedatectl set-timezone Asia/Seoul
## 참고: 다른 방법
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
Bash
복사
10) NTP(Network Time Protocol) 서비스 설치 및 실행
시스템 시간이 클러스터의 모든 노드에서 동기화 되도록 설치하고 실행하십시오.
## NTP 동기화 확인
timedatectl | grep NTP
NTP enabled: yes
NTP synchronized: yes
## 기동 확인: chronyd 가 활성화된 상태의 예시
sudo systemctl status chronyd
● chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-04-26 10:02:58 KST; 9h ago
… 이하, 출력 생략 …
# 또는
ps -ef | grep chronyd
chrony 571 1 0 10:02 ? 00:00:00 /usr/sbin/chronyd
Bash
복사
•
서비스 설치 및 기동
chronyd(권장) 또는 ntpd 미설치시 설치를 진행하거나, 이미 설치되었다면 설정을 업데이트하고 기동하십시오.
주의) 타임서버의 설정은 업체의 권고설정을 따르십시오.
### chrony 일 때
## 설치
sudo yum install chrony
## 설정변경
sudo vi /etc/chrony.conf
## server 설정은 기본 설정 유지해도 되지만, 업체의 권고설정을 권장
## 참고 : 우리나라/아시아 서버들
#server 2.kr.pool.ntp.org iburst
#server time.bora.net iburst
#server time.kornet.net iburst
#server 3.kr.pool.ntp.org iburst
#server 1.asia.pool.ntp.org iburst
#server 2.asia.pool.ntp.org iburst
## 기동
sudo systemctl start chronyd
## 부팅 시 자동으로 기동 되도록 설정
sudo chkconfig chronyd on
## 중단
sudo systemctl stop chronyd
## 참고 : 기타 명령어들
# 상태 정보
chronyc sources
또는
chronyc tracking
## 동기화 및 H/W 시간 설정
sudo chronyc -a makestep
sudo hwclock -w
### ntp 일 때
## 설치
sudo yum install ntp
## 설정변경
sudo vi /etc/ntp.conf 또는 /etc/ntp/ntp.conf
## server 설정은 기본 설정 유지해도 되지만, 업체의 권고설정을 권장
## 참고 : 우리나라/아시아 서버들
#server 2.kr.pool.ntp.org
#server time.bora.net
#server time.kornet.net
#server 3.kr.pool.ntp.org
#server 1.asia.pool.ntp.org
#server 2.asia.pool.ntp.org
## 기동
sudo systemctl start ntpd
## 부팅 시 자동으로 기동 되도록 설정
sudo chkconfig ntpd on
## 중단
sudo systemctl stop ntpd
## 참고 : 기타 명령어들
# 상태 정보
ntpq -p
또는
ntpstat
## 동기화 및 H/W 시간 설정
sudo systemctl stop ntpd # ntpd 가 실행 중일 경우 ntpdate 가 실행되지 않음
sudo ntpdate [NTP server] #한번 수행으로 차이가 크게 줄어들지 않으므로, 여러 번 수행 필요
sudo hwclock -w
sudo systemctl start ntpd
Bash
복사
일자 | 작성자 | 비고 |
2022.4.26 | min | |
2022.07.22 | jnshin | kernel memory 설정 안내 변경.
ulimit 관련 안내 추가 |