Hadoop, Impala, Spark, NiFi를 위한 Linux 커널 파라미터 튜닝 완벽 가이드
대용량 데이터 워크로드 시스템(Hadoop, Impala, Spark, NiFi)에서 필수적으로 설정해야 하는 Linux sysctl.conf, GRUB, limits.conf, 디스크 I/O 파라미터를 설정 의미, 권장값, 잘못된 설정 시 발생하는 이슈와 함께 정리합니다.
Hadoop, Impala, Spark, NiFi와 같은 대용량 데이터 처리 시스템을 운영할 때, Linux OS 레벨의 커널 파라미터를 올바르게 튜닝하지 않으면 성능 저하, OOM(Out of Memory), 네트워크 타임아웃, 파일 디스크립터 부족 등 다양한 문제가 발생합니다. 이 글에서는 각 파라미터의 의미, 권장값, 그리고 잘못 설정했을 때 나타나는 실제 이슈를 함께 정리합니다.
1. 개요
대용량 워크로드 시스템은 일반적인 웹 서버나 애플리케이션 서버와는 근본적으로 다른 리소스 사용 패턴을 가집니다.
| 특성 | 일반 서버 | 빅데이터 워크로드 |
|---|---|---|
| 메모리 | 수 GB, 균등 사용 | 수십~수백 GB, 대량 버퍼/캐시 |
| 네트워크 | 소규모 요청/응답 | 대용량 데이터 셔플, 블록 전송 |
| 파일 디스크립터 | 수백~수천 | 수만~수십만 |
| 프로세스/스레드 | 수십~수백 | 수천~수만 |
| 디스크 I/O | 랜덤 I/O 위주 | 대량 순차 I/O |
Linux의 기본 커널 파라미터는 범용 서버를 기준으로 설정되어 있으므로, 빅데이터 워크로드에 맞게 반드시 조정해야 합니다. 설정은 크게 네 가지 영역으로 나뉩니다:
- sysctl.conf — 커널 런타임 파라미터 (메모리, 네트워크, 파일시스템)
- GRUB 부트 파라미터 — 부팅 시 적용되는 커널 옵션
- limits.conf — 사용자/프로세스별 리소스 제한
- 디스크/파일시스템 — I/O 스케줄러, 마운트 옵션
2. sysctl.conf 파라미터
/etc/sysctl.conf 파일에 설정하며, sysctl -p 명령으로 즉시 적용할 수 있습니다.
2.1 메모리 관련
vm.swappiness
| 항목 | 내용 |
|---|---|
| 의미 | 커널이 물리 메모리 대신 swap 영역을 사용하는 빈도를 제어 (0~100) |
| 기본값 | 60 |
| 권장값 | 1 (완전히 0으로 설정하면 OOM Killer가 즉시 동작할 수 있음) |
vm.swappiness = 1잘못 설정 시 이슈:
- 값이 높은 경우 (60 이상): 메모리에 여유가 있어도 swap을 사용하여 Hadoop DataNode, Impala Daemon, Spark Executor의 성능이 급격히 저하됩니다. 특히 Impala는 메모리 기반 쿼리 엔진이므로 swap 사용 시 쿼리 응답 시간이 10~100배까지 증가할 수 있습니다.
- 값이 0인 경우: swap을 아예 사용하지 않아 메모리 부족 시 OOM Killer가 즉시 프로세스를 종료합니다. DataNode나 NameNode가 갑자기 죽는 현상이 발생합니다.
vm.dirty_ratio
| 항목 | 내용 |
|---|---|
| 의미 | 전체 메모리 대비 dirty page(디스크에 아직 쓰지 않은 데이터)의 최대 비율. 이 비율에 도달하면 프로세스가 직접 디스크에 쓰기를 시작 |
| 기본값 | 20 (%) |
| 권장값 | 10 ~ 15 |
vm.dirty_ratio = 10잘못 설정 시 이슈:
- 값이 너무 높은 경우 (30 이상): dirty page가 대량으로 쌓인 후 한꺼번에 flush가 발생하여 I/O 스파이크가 생깁니다. HDFS DataNode가 블록 리포트를 제때 보내지 못하거나, NiFi FlowFile 저장소 쓰기가 지연되어 back pressure가 발생합니다.
- 값이 너무 낮은 경우 (5 이하): 너무 빈번한 디스크 쓰기로 인해 throughput이 저하됩니다. Spark shuffle write 성능이 크게 떨어집니다.
vm.dirty_background_ratio
| 항목 | 내용 |
|---|---|
| 의미 | 백그라운드 flush 프로세스(pdflush/writeback)가 dirty page를 디스크에 쓰기 시작하는 임계 비율 |
| 기본값 | 10 (%) |
| 권장값 | 5 |
vm.dirty_background_ratio = 5잘못 설정 시 이슈:
- 값이 너무 높은 경우: 백그라운드 flush가 늦게 시작되어 dirty page가
vm.dirty_ratio에 도달하면 동기 쓰기가 발생하고, 애플리케이션이 I/O 대기 상태에 빠집니다. - dirty_ratio보다 높게 설정: 백그라운드 flush가 동작하지 않아 항상 동기 쓰기만 발생하는 최악의 상황이 됩니다.
vm.overcommit_memory
| 항목 | 내용 |
|---|---|
| 의미 | 커널의 메모리 오버커밋 정책을 제어 (0: 휴리스틱, 1: 항상 허용, 2: 제한) |
| 기본값 | 0 |
| 권장값 | 1 (Hadoop/Spark 환경) |
vm.overcommit_memory = 1잘못 설정 시 이슈:
- 값이 0 (기본값)인 경우: 커널이 메모리 요청을 거부할 수 있어
fork()실패가 발생합니다. Hadoop MapReduce의 child task나 Spark executor가 프로세스 생성에 실패하면서 task가 반복적으로 실패합니다. - 값이 2인 경우: 물리 메모리 + swap 이상의 메모리 할당을 엄격하게 차단합니다. JVM 기반 빅데이터 시스템은 대량의 가상 메모리를 예약하므로, 실제 사용량이 적더라도 프로세스 시작 자체가 실패할 수 있습니다.
vm.zone_reclaim_mode
| 항목 | 내용 |
|---|---|
| 의미 | NUMA 노드의 로컬 메모리가 부족할 때 로컬에서 메모리를 회수할지, 원격 노드에서 할당할지 결정 |
| 기본값 | 0 또는 1 (배포판에 따라 다름) |
| 권장값 | 0 |
vm.zone_reclaim_mode = 0잘못 설정 시 이슈:
- 값이 1인 경우: 로컬 NUMA 노드에서 page cache를 공격적으로 회수하여 데이터를 다시 디스크에서 읽어야 합니다. HDFS 읽기 성능이 크게 저하되며, Impala 쿼리에서 예측 불가능한 성능 변동(jitter)이 발생합니다. Cloudera, Hortonworks 모두 이 값을 0으로 설정하도록 권장합니다.
2.2 네트워크 관련
net.core.somaxconn
| 항목 | 내용 |
|---|---|
| 의미 | listen 소켓의 backlog 큐 최대 길이. 동시 연결 요청이 대기할 수 있는 수 |
| 기본값 | 128 |
| 권장값 | 4096 이상 |
net.core.somaxconn = 4096잘못 설정 시 이슈:
- 기본값(128)으로 유지 시: 동시 연결이 많은 환경에서 connection refused 에러가 발생합니다. NiFi의 ListenHTTP 프로세서가 데이터를 수신하지 못하거나, Spark Shuffle Service에 대한 연결이 거부되어 shuffle fetch failure가 발생합니다.
net.core.rmem_max / net.core.wmem_max
| 항목 | 내용 |
|---|---|
| 의미 | 소켓의 수신(rmem)/송신(wmem) 버퍼 최대 크기 (bytes) |
| 기본값 | 212992 (~208KB) |
| 권장값 | 16777216 (16MB) 이상 |
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216잘못 설정 시 이슈:
- 기본값으로 유지 시: HDFS 블록 전송(128MB 블록), Spark shuffle, Impala 브로드캐스트 조인에서 네트워크 병목이 발생합니다. TCP window scaling이 제대로 동작하지 않아 10Gbps 네트워크에서도 실제 throughput이 1~2Gbps에 머무를 수 있습니다.
net.ipv4.tcp_rmem / net.ipv4.tcp_wmem
| 항목 | 내용 |
|---|---|
| 의미 | TCP 소켓의 수신/송신 버퍼 크기 (min, default, max) |
| 기본값 | 4096 87380 6291456 |
| 권장값 | 4096 65536 16777216 |
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216잘못 설정 시 이슈:
- max 값이 낮은 경우: 대용량 데이터 전송 시 TCP window가 충분히 확장되지 않아 네트워크 대역폭을 활용하지 못합니다. 노드 간 데이터 복제(HDFS replication)가 느려져 데이터 적재 시간이 길어집니다.
- default 값이 너무 높은 경우: 모든 TCP 연결이 기본적으로 큰 버퍼를 할당받아 메모리를 낭비합니다. 수천 개의 연결이 있는 DataNode에서 메모리 부족이 발생할 수 있습니다.
net.ipv4.tcp_max_syn_backlog
| 항목 | 내용 |
|---|---|
| 의미 | SYN_RECEIVED 상태의 연결 대기 큐 최대 크기 |
| 기본값 | 1024 |
| 권장값 | 4096 이상 |
net.ipv4.tcp_max_syn_backlog = 4096잘못 설정 시 이슈:
- 기본값으로 유지 시: 클러스터 재시작 후 모든 노드가 동시에 연결을 시도할 때 SYN 큐가 넘쳐 연결이 드롭됩니다. YARN NodeManager 재등록, Impala StateStore 구독 갱신이 실패하여 클러스터 복구 시간이 길어집니다.
net.ipv4.ip_local_port_range
| 항목 | 내용 |
|---|---|
| 의미 | 클라이언트 소켓에 할당할 수 있는 ephemeral 포트 범위 |
| 기본값 | 32768 60999 |
| 권장값 | 10000 65535 |
net.ipv4.ip_local_port_range = 10000 65535잘못 설정 시 이슈:
- 포트 범위가 좁은 경우: 대량의 아웃바운드 연결을 생성하는 Spark shuffle, NiFi Site-to-Site 전송에서 "Cannot assign requested address" 에러가 발생합니다. 특히 짧은 시간에 대량의 연결을 맺고 끊는 경우 TIME_WAIT 상태의 포트가 고갈됩니다.
2.3 파일시스템/IPC 관련
fs.file-max
| 항목 | 내용 |
|---|---|
| 의미 | 시스템 전체에서 열 수 있는 파일 디스크립터의 최대 수 |
| 기본값 | 약 100000 (시스템에 따라 다름) |
| 권장값 | 6553600 이상 |
fs.file-max = 6553600잘못 설정 시 이슈:
- 값이 낮은 경우: "Too many open files" 에러가 발생합니다. HDFS DataNode는 각 블록마다 파일 디스크립터를 사용하므로, 수만 개의 블록을 저장하는 노드에서 파일 디스크립터가 고갈되면 데이터 읽기/쓰기가 모두 실패합니다. NiFi도 FlowFile과 Content Repository 접근에 많은 파일 디스크립터를 사용합니다.
fs.nr_open
| 항목 | 내용 |
|---|---|
| 의미 | 단일 프로세스가 열 수 있는 파일 디스크립터의 하드 리밋 상한 |
| 기본값 | 1048576 |
| 권장값 | 1048576 이상 (limits.conf의 nofile보다 커야 함) |
fs.nr_open = 1048576잘못 설정 시 이슈:
- limits.conf의 nofile보다 작은 경우: limits.conf에 아무리 높은 값을 설정해도 fs.nr_open이 상한을 제한하여 의도한 만큼 파일을 열 수 없습니다.
kernel.pid_max
| 항목 | 내용 |
|---|---|
| 의미 | 시스템에서 할당할 수 있는 최대 PID 수 |
| 기본값 | 32768 |
| 권장값 | 4194304 |
kernel.pid_max = 4194304잘못 설정 시 이슈:
- 기본값으로 유지 시: YARN이 수천 개의 container를 실행하면 PID가 고갈되어 새로운 프로세스를 생성할 수 없습니다. "fork: retry: Resource temporarily unavailable" 에러가 발생하며, 클러스터의 모든 job이 중단됩니다.
3. GRUB 부트 파라미터
/etc/default/grub 파일의 GRUB_CMDLINE_LINUX에 설정하며, 변경 후 grub2-mkconfig -o /boot/grub2/grub.cfg 및 재부팅이 필요합니다.
3.1 Transparent Huge Pages (THP) 비활성화
GRUB_CMDLINE_LINUX="... transparent_hugepage=never"| 항목 | 내용 |
|---|---|
| 의미 | 커널이 2MB 크기의 거대 페이지를 자동으로 할당/병합하는 기능을 제어 |
| 기본값 | always 또는 madvise |
| 권장값 | never |
잘못 설정 시 이슈:
- THP가 활성화된 경우 (
always): 커널이 백그라운드에서 메모리 페이지를 병합(compaction)하면서 예측 불가능한 latency spike가 발생합니다. 이는 빅데이터 시스템에서 가장 흔하고 치명적인 설정 실수 중 하나입니다.- Hadoop: DataNode의 GC 시간이 비정상적으로 길어져 NameNode가 DataNode를 dead로 판정합니다.
- Impala: 쿼리 실행 중 갑작스러운 pause가 발생하여 쿼리 타임아웃이 발생합니다.
- Spark: Executor의 GC pause가 길어져 task가 실패하고, speculation이 과도하게 발생합니다.
- NiFi: FlowFile 처리 중 stall이 발생하여 back pressure가 연쇄적으로 전파됩니다.
Cloudera, Hortonworks(현 Cloudera), MapR 모두 THP를 반드시 비활성화하도록 공식 문서에서 명시합니다.
런타임에서도 확인 및 비활성화할 수 있습니다:
# 현재 상태 확인
cat /sys/kernel/mm/transparent_hugepage/enabled
# 런타임 비활성화
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag3.2 NUMA 관련 설정
GRUB_CMDLINE_LINUX="... numa=off"| 항목 | 내용 |
|---|---|
| 의미 | NUMA(Non-Uniform Memory Access) 인터리빙을 비활성화하여 모든 메모리를 단일 노드로 취급 |
| 기본값 | NUMA 활성화 |
| 권장값 | 환경에 따라 다름 (아래 참고) |
NUMA 설정 전략:
| 환경 | 권장 설정 | 이유 |
|---|---|---|
| JVM 기반 (Hadoop, Spark) | numa=off 또는 numactl --interleave=all | JVM은 NUMA를 인식하지 못하므로 메모리 편향 발생 |
| Impala (C++ 기반) | NUMA 활성화 유지 + vm.zone_reclaim_mode=0 | Impala는 NUMA-aware 메모리 할당을 지원 |
잘못 설정 시 이슈:
- JVM 워크로드에서 NUMA 활성화 시: JVM의 힙 메모리가 하나의 NUMA 노드에 집중되어 원격 메모리 접근이 빈번해지고, 메모리 접근 latency가 2~3배 증가합니다. GC 시간이 길어지고 throughput이 저하됩니다.
- Impala에서 NUMA 비활성화 시: Impala가 NUMA topology를 활용한 최적화를 수행할 수 없어 메모리 접근 성능이 떨어집니다.
3.3 CPU Frequency Scaling / Power Management
GRUB_CMDLINE_LINUX="... intel_pstate=disable processor.max_cstate=1"또는 BIOS에서 설정:
| 항목 | 내용 |
|---|---|
| 의미 | CPU가 부하에 따라 주파수를 낮추거나 절전 상태로 전환하는 기능 제어 |
| 기본값 | 절전 모드 활성화 (powersave 또는 ondemand governor) |
| 권장값 | performance governor, C-State 제한 |
# CPU governor를 performance로 설정
cpupower frequency-set -g performance
# 또는 모든 CPU에 일괄 적용
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo performance > $cpu
done잘못 설정 시 이슈:
- 절전 모드가 활성화된 경우: CPU가 deep C-state에서 깨어나는 데 수십~수백 마이크로초가 소요됩니다. 대량의 짧은 요청을 처리하는 Impala에서는 이 지연이 누적되어 쿼리 latency가 증가합니다.
ondemandgovernor: CPU 주파수를 올리는 데 시간이 걸려 burst 워크로드 시작 시 성능이 낮게 시작됩니다. Spark job의 초기 stage에서 성능이 저하될 수 있습니다.
4. Limits 설정 (/etc/security/limits.conf)
/etc/security/limits.conf 또는 /etc/security/limits.d/ 디렉토리에 설정합니다.
4.1 nofile (Open File Descriptors)
* soft nofile 65536
* hard nofile 65536| 항목 | 내용 |
|---|---|
| 의미 | 프로세스당 열 수 있는 최대 파일 디스크립터 수 |
| 기본값 | 1024 (soft), 4096 (hard) |
| 권장값 | 65536 이상 (Impala, NiFi는 131072 권장) |
잘못 설정 시 이슈:
- 기본값(1024)으로 유지 시:
- HDFS DataNode: 블록 수가 증가하면 "Too many open files" 에러와 함께 블록 읽기/쓰기가 실패합니다.
- Impala: 다수의 파티션을 스캔하는 쿼리에서 파일 디스크립터가 부족하여 쿼리가 실패합니다.
- NiFi: 대량의 FlowFile을 동시에 처리할 때 Content Repository 접근이 실패합니다.
- Spark: 많은 파티션을 가진 shuffle 파일을 읽을 때 실패합니다.
4.2 nproc (Max User Processes)
* soft nproc 65536
* hard nproc 65536| 항목 | 내용 |
|---|---|
| 의미 | 사용자당 생성할 수 있는 최대 프로세스(스레드 포함) 수 |
| 기본값 | 4096 |
| 권장값 | 65536 이상 |
잘못 설정 시 이슈:
- 기본값(4096)으로 유지 시: JVM은 Java 스레드마다 OS 스레드를 생성합니다. Spark Executor가 수백 개의 스레드를 사용하는 환경에서 YARN Container가 프로세스 생성에 실패하며, "unable to create native thread" 에러가 발생합니다. 이 에러는 OOM과 혼동되기 쉽지만, 실제로는 nproc 제한이 원인입니다.
4.3 memlock (Memory Lock)
* soft memlock unlimited
* hard memlock unlimited| 항목 | 내용 |
|---|---|
| 의미 | 프로세스가 swap 불가능하게 잠글 수 있는 메모리의 최대 크기 (KB) |
| 기본값 | 64 |
| 권장값 | unlimited |
잘못 설정 시 이슈:
- 기본값으로 유지 시:
- Impala: Impala는 성능을 위해 메모리를 lock하여 swap을 방지합니다. memlock 제한이 낮으면 Impala 데몬이 시작되지 않거나, 메모리를 lock하지 못해 swap이 발생합니다.
- HDFS DataNode: DataNode의 short-circuit read 기능에서 메모리 매핑된 파일에 대한 lock이 실패할 수 있습니다.
5. 디스크/파일시스템 최적화
5.1 I/O 스케줄러
| 항목 | 내용 |
|---|---|
| 의미 | 디스크 I/O 요청의 순서를 결정하는 알고리즘 |
| HDD 권장 | deadline |
| SSD/NVMe 권장 | noop 또는 none (multi-queue) |
# 현재 스케줄러 확인
cat /sys/block/sda/queue/scheduler
# 런타임 변경 (HDD)
echo deadline > /sys/block/sda/queue/scheduler
# 런타임 변경 (SSD)
echo noop > /sys/block/sda/queue/scheduler영구 설정 (GRUB):
GRUB_CMDLINE_LINUX="... elevator=deadline"또는 udev rule:
# /etc/udev/rules.d/60-scheduler.rules
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
ACTION=="add|change", KERNEL=="nvme*", ATTR{queue/scheduler}="none"잘못 설정 시 이슈:
- SSD에서
cfq스케줄러 사용 시: CFQ(Completely Fair Queuing)는 HDD의 seek time을 최소화하기 위해 설계되었습니다. SSD에서는 불필요한 요청 정렬과 대기 시간을 추가하여 IOPS 성능이 30~50% 저하될 수 있습니다. - HDD에서
noop스케줄러 사용 시: 요청 순서 최적화가 없어 디스크 헤드가 비효율적으로 이동하며, 순차 읽기 성능이 저하됩니다.
5.2 마운트 옵션
# /etc/fstab 예시
/dev/sdb1 /data1 ext4 defaults,noatime,nodiratime 0 2
/dev/sdc1 /data2 xfs defaults,noatime,nodiratime 0 2| 옵션 | 의미 |
|---|---|
noatime | 파일 접근 시 접근 시간(atime)을 업데이트하지 않음 |
nodiratime | 디렉토리 접근 시 접근 시간을 업데이트하지 않음 |
잘못 설정 시 이슈:
noatime미설정 시: 파일을 읽을 때마다 메타데이터 쓰기가 발생합니다. HDFS DataNode가 블록을 읽을 때마다 디스크에 쓰기 I/O가 추가로 발생하여, 읽기 중심 워크로드에서 불필요한 디스크 부하가 20~30% 증가할 수 있습니다.
5.3 Read-ahead 설정
| 항목 | 내용 |
|---|---|
| 의미 | 커널이 순차 읽기를 감지했을 때 미리 읽어오는 데이터의 크기 (512-byte 섹터 단위) |
| 기본값 | 256 (128KB) |
| 권장값 | 2048 ~ 4096 (1MB ~ 2MB) |
# 현재 값 확인
blockdev --getra /dev/sda
# 설정 변경
blockdev --setra 2048 /dev/sda잘못 설정 시 이슈:
- 값이 너무 낮은 경우: HDFS의 128MB 블록을 순차적으로 읽을 때 디스크 seek이 빈번하여 throughput이 저하됩니다. MapReduce, Spark의 full table scan 성능이 떨어집니다.
- 값이 너무 높은 경우 (8192 이상): 랜덤 I/O 워크로드에서 불필요한 데이터를 과도하게 읽어와 메모리를 낭비하고 다른 I/O 요청을 지연시킵니다.
6. 워크로드별 권장 설정 요약
6.1 Hadoop (HDFS/YARN)
# /etc/sysctl.conf
vm.swappiness = 1
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.overcommit_memory = 1
vm.zone_reclaim_mode = 0
fs.file-max = 6553600
kernel.pid_max = 4194304
net.core.somaxconn = 4096
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.ip_local_port_range = 10000 65535# /etc/security/limits.conf
hdfs soft nofile 65536
hdfs hard nofile 65536
hdfs soft nproc 65536
hdfs hard nproc 65536
yarn soft nofile 65536
yarn hard nofile 65536
yarn soft nproc 65536
yarn hard nproc 655366.2 Impala
Impala는 C++ 기반이며 메모리를 직접 관리하므로 추가 설정이 필요합니다.
# 추가 sysctl 설정
net.ipv4.tcp_max_syn_backlog = 4096
# /etc/security/limits.conf
impala soft nofile 131072
impala hard nofile 131072
impala soft nproc 65536
impala hard nproc 65536
impala soft memlock unlimited
impala hard memlock unlimitedImpala의 경우 THP 비활성화와 memlock unlimited 설정이 특히 중요합니다. 이 두 가지만 빠뜨려도 쿼리 성능이 10배 이상 저하될 수 있습니다.
6.3 Spark
# Spark 추가 고려사항
vm.overcommit_memory = 1 # Executor fork 실패 방지
kernel.pid_max = 4194304 # 대량 container 실행 지원
# /etc/security/limits.conf
spark soft nofile 65536
spark hard nofile 65536
spark soft nproc 65536
spark hard nproc 65536Spark은 Dynamic Allocation 사용 시 Executor 수가 급격히 변동하므로, nproc과 pid_max 설정이 충분해야 합니다.
6.4 NiFi
NiFi는 대량의 동시 연결과 파일 I/O를 처리하므로 파일 디스크립터와 네트워크 설정이 중요합니다.
# /etc/security/limits.conf
nifi soft nofile 131072
nifi hard nofile 131072
nifi soft nproc 65536
nifi hard nproc 65536
# NiFi 추가 sysctl
net.core.somaxconn = 4096
net.ipv4.ip_local_port_range = 10000 65535NiFi는 bootstrap.conf에서 JVM 옵션으로
-XX:+UseG1GC를 사용하고,nifi.properties에서 thread pool 크기를 조정하는 것도 함께 권장됩니다.
7. 설정 적용 및 검증 방법
7.1 설정 적용 순서
1. /etc/sysctl.conf 수정 → sysctl -p 로 적용
2. /etc/security/limits.conf 수정 → 재로그인 필요
3. /etc/default/grub 수정 → grub2-mkconfig + 재부팅 필요
4. 디스크 I/O 설정 → 런타임 즉시 적용 (영구 설정은 udev rule)
5. 마운트 옵션 → remount 또는 재부팅
7.2 설정 검증 스크립트
아래 스크립트로 주요 설정값을 한 번에 확인할 수 있습니다:
#!/bin/bash
echo "=== Memory ==="
echo "vm.swappiness = $(sysctl -n vm.swappiness)"
echo "vm.dirty_ratio = $(sysctl -n vm.dirty_ratio)"
echo "vm.dirty_background = $(sysctl -n vm.dirty_background_ratio)"
echo "vm.overcommit_memory = $(sysctl -n vm.overcommit_memory)"
echo "vm.zone_reclaim_mode = $(sysctl -n vm.zone_reclaim_mode)"
echo ""
echo "=== Network ==="
echo "somaxconn = $(sysctl -n net.core.somaxconn)"
echo "rmem_max = $(sysctl -n net.core.rmem_max)"
echo "wmem_max = $(sysctl -n net.core.wmem_max)"
echo "tcp_rmem = $(sysctl -n net.ipv4.tcp_rmem)"
echo "tcp_wmem = $(sysctl -n net.ipv4.tcp_wmem)"
echo "ip_local_port_range = $(sysctl -n net.ipv4.ip_local_port_range)"
echo ""
echo "=== File System ==="
echo "fs.file-max = $(sysctl -n fs.file-max)"
echo "kernel.pid_max = $(sysctl -n kernel.pid_max)"
echo ""
echo "=== THP ==="
echo "THP enabled = $(cat /sys/kernel/mm/transparent_hugepage/enabled)"
echo "THP defrag = $(cat /sys/kernel/mm/transparent_hugepage/defrag)"
echo ""
echo "=== Limits (current user) ==="
echo "nofile soft = $(ulimit -Sn)"
echo "nofile hard = $(ulimit -Hn)"
echo "nproc soft = $(ulimit -Su)"
echo "nproc hard = $(ulimit -Hu)"
echo ""
echo "=== Disk I/O ==="
for disk in /sys/block/sd*/queue/scheduler; do
echo "$(basename $(dirname $(dirname $disk))) scheduler = $(cat $disk)"
done
for disk in /sys/block/sd*; do
echo "$(basename $disk) readahead = $(blockdev --getra /dev/$(basename $disk) 2>/dev/null)"
done
echo ""
echo "=== Mount Options ==="
mount | grep -E "^/dev/" | awk '{print $1, $3, $6}'7.3 주의사항
- 운영 중인 클러스터에서는 한 번에 하나의 파라미터만 변경하고 효과를 모니터링하세요.
- sysctl 설정은 재부팅 후에도 유지되지만,
echo명령으로 직접 변경한 값은 재부팅 시 초기화됩니다. - limits.conf 변경은 새로운 세션에서만 적용됩니다. 기존 프로세스에는 영향이 없습니다.
- GRUB 변경은 반드시
grub2-mkconfig실행 후 재부팅해야 합니다.