14. Linux ์„ฑ๋Šฅ ํŠœ๋‹

14. Linux ์„ฑ๋Šฅ ํŠœ๋‹

ํ•™์Šต ๋ชฉํ‘œ

  • ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ถ„์„
  • sysctl์„ ํ†ตํ•œ ์ปค๋„ ํŒŒ๋ผ๋ฏธํ„ฐ ์ตœ์ ํ™”
  • CPU, ๋ฉ”๋ชจ๋ฆฌ, I/O ์„ฑ๋Šฅ ํŠœ๋‹
  • perf์™€ flamegraph๋ฅผ ํ™œ์šฉํ•œ ํ”„๋กœํŒŒ์ผ๋ง

๋ชฉ์ฐจ

  1. ์„ฑ๋Šฅ ๋ถ„์„ ๊ธฐ์ดˆ
  2. CPU ํŠœ๋‹
  3. ๋ฉ”๋ชจ๋ฆฌ ํŠœ๋‹
  4. I/O ํŠœ๋‹
  5. ๋„คํŠธ์›Œํฌ ํŠœ๋‹
  6. ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ
  7. ์—ฐ์Šต ๋ฌธ์ œ

1. ์„ฑ๋Šฅ ๋ถ„์„ ๊ธฐ์ดˆ

1.1 USE ๋ฐฉ๋ฒ•๋ก 

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                USE ๋ฐฉ๋ฒ•๋ก  (Brendan Gregg)                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                             โ”‚
โ”‚  ๊ฐ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ํ™•์ธ:                                     โ”‚
โ”‚                                                             โ”‚
โ”‚  U - Utilization (์‚ฌ์šฉ๋ฅ )                                   โ”‚
โ”‚      ๋ฆฌ์†Œ์Šค๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š”๊ฐ€?                       โ”‚
โ”‚      ์˜ˆ: CPU 80% ์‚ฌ์šฉ ์ค‘                                    โ”‚
โ”‚                                                             โ”‚
โ”‚  S - Saturation (ํฌํ™”๋„)                                    โ”‚
โ”‚      ์ž‘์—…์ด ๋Œ€๊ธฐ ์ค‘์ธ๊ฐ€?                                    โ”‚
โ”‚      ์˜ˆ: ์‹คํ–‰ ๋Œ€๊ธฐ์—ด์— 10๊ฐœ ํ”„๋กœ์„ธ์Šค                        โ”‚
โ”‚                                                             โ”‚
โ”‚  E - Errors (์—๋Ÿฌ)                                          โ”‚
โ”‚      ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”๊ฐ€?                                     โ”‚
โ”‚      ์˜ˆ: ๋„คํŠธ์›Œํฌ ํŒจํ‚ท ๋“œ๋กญ                                 โ”‚
โ”‚                                                             โ”‚
โ”‚  ์ฃผ์š” ๋ฆฌ์†Œ์Šค:                                               โ”‚
โ”‚  โ€ข CPU: mpstat, vmstat, top                                โ”‚
โ”‚  โ€ข Memory: free, vmstat, /proc/meminfo                     โ”‚
โ”‚  โ€ข Disk I/O: iostat, iotop                                 โ”‚
โ”‚  โ€ข Network: netstat, ss, sar                               โ”‚
โ”‚                                                             โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1.2 ๊ธฐ๋ณธ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ

# top - ์‹ค์‹œ๊ฐ„ ํ”„๋กœ์„ธ์Šค ๋ชจ๋‹ˆํ„ฐ๋ง
top
# ๋‹จ์ถ•ํ‚ค: 1=CPU๋ณ„, M=๋ฉ”๋ชจ๋ฆฌ์ˆœ, P=CPU์ˆœ, k=kill

# htop - ํ–ฅ์ƒ๋œ top
htop

# vmstat - ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ํ†ต๊ณ„
vmstat 1 5  # 1์ดˆ ๊ฐ„๊ฒฉ, 5ํšŒ
#  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
#  2  0      0 1234567 12345 234567    0    0     1     2  100  200  5  2 93  0  0
# r: ์‹คํ–‰ ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค
# b: I/O ๋Œ€๊ธฐ ํ”„๋กœ์„ธ์Šค
# si/so: swap in/out
# bi/bo: block in/out
# us/sy/id/wa: user/system/idle/wait

# mpstat - CPU ํ†ต๊ณ„
mpstat -P ALL 1  # ๋ชจ๋“  CPU, 1์ดˆ ๊ฐ„๊ฒฉ

# iostat - I/O ํ†ต๊ณ„
iostat -x 1      # ํ™•์žฅ ์ •๋ณด, 1์ดˆ ๊ฐ„๊ฒฉ

# sar - ์‹œ์Šคํ…œ ํ™œ๋™ ๋ฆฌํฌํŠธ
sar -u 1 5       # CPU
sar -r 1 5       # ๋ฉ”๋ชจ๋ฆฌ
sar -d 1 5       # ๋””์Šคํฌ
sar -n DEV 1 5   # ๋„คํŠธ์›Œํฌ

# free - ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
free -h

# uptime - ๋ถ€ํ•˜ ํ‰๊ท 
uptime
# load average: 1.50, 1.20, 0.80  (1๋ถ„, 5๋ถ„, 15๋ถ„)

1.3 sysctl ๊ธฐ๋ณธ

# ํ˜„์žฌ ์„ค์ • ํ™•์ธ
sysctl -a                    # ๋ชจ๋“  ์„ค์ •
sysctl vm.swappiness         # ํŠน์ • ์„ค์ •
cat /proc/sys/vm/swappiness  # ์ง์ ‘ ์ฝ๊ธฐ

# ์ž„์‹œ ๋ณ€๊ฒฝ
sysctl -w vm.swappiness=10
# ๋˜๋Š”
echo 10 > /proc/sys/vm/swappiness

# ์˜๊ตฌ ์„ค์ •
# /etc/sysctl.conf ๋˜๋Š” /etc/sysctl.d/*.conf
echo "vm.swappiness = 10" >> /etc/sysctl.d/99-custom.conf
sysctl -p /etc/sysctl.d/99-custom.conf  # ์ ์šฉ
sysctl --system  # ๋ชจ๋“  ์„ค์ • ํŒŒ์ผ ๋กœ๋“œ

2. CPU ํŠœ๋‹

2.1 CPU ์ •๋ณด ํ™•์ธ

# CPU ์ •๋ณด
lscpu
cat /proc/cpuinfo

# CPU ์ฃผํŒŒ์ˆ˜
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
cpupower frequency-info

# NUMA ์ •๋ณด
numactl --hardware
lscpu | grep NUMA

2.2 CPU Governor

# ํ˜„์žฌ governor ํ™•์ธ
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# performance, powersave, userspace, ondemand, conservative, schedutil

# Governor ๋ณ€๊ฒฝ
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# cpupower ์‚ฌ์šฉ
cpupower frequency-set -g performance

# ์˜๊ตฌ ์„ค์ • (Ubuntu)
# /etc/default/cpufrequtils
GOVERNOR="performance"

2.3 ํ”„๋กœ์„ธ์Šค ์šฐ์„ ์ˆœ์œ„

# nice ๊ฐ’ (-20 ~ 19, ๋‚ฎ์„์ˆ˜๋ก ๋†’์€ ์šฐ์„ ์ˆœ์œ„)
nice -n -10 ./high-priority-task
renice -n -10 -p <PID>

# ์‹ค์‹œ๊ฐ„ ์Šค์ผ€์ค„๋ง
chrt -f 50 ./realtime-task  # FIFO, ์šฐ์„ ์ˆœ์œ„ 50
chrt -r 50 ./realtime-task  # Round Robin

# CPU ์นœํ™”์„ฑ (affinity)
taskset -c 0,1 ./my-program  # CPU 0, 1์—์„œ๋งŒ ์‹คํ–‰
taskset -cp 0-3 <PID>        # ์‹คํ–‰ ์ค‘ ํ”„๋กœ์„ธ์Šค ๋ณ€๊ฒฝ

# cgroups๋กœ CPU ์ œํ•œ
# /sys/fs/cgroup/cpu/mygroup/
mkdir /sys/fs/cgroup/cpu/mygroup
echo 50000 > /sys/fs/cgroup/cpu/mygroup/cpu.cfs_quota_us  # 50% ์ œํ•œ
echo <PID> > /sys/fs/cgroup/cpu/mygroup/cgroup.procs

2.4 CPU ๊ด€๋ จ sysctl

# /etc/sysctl.d/99-cpu.conf

# ์Šค์ผ€์ค„๋Ÿฌ ํŠœ๋‹
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000
kernel.sched_migration_cost_ns = 5000000

# ์›Œํฌ๋กœ๋“œ๋ณ„ ์ตœ์ ํ™”
# ์„œ๋ฒ„ ์›Œํฌ๋กœ๋“œ (์ฒ˜๋ฆฌ๋Ÿ‰ ์ค‘์‹ฌ)
kernel.sched_autogroup_enabled = 0

# ๋ฐ์Šคํฌํ†ฑ ์›Œํฌ๋กœ๋“œ (์‘๋‹ต์„ฑ ์ค‘์‹ฌ)
kernel.sched_autogroup_enabled = 1

3. ๋ฉ”๋ชจ๋ฆฌ ํŠœ๋‹

3.1 ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด ํ™•์ธ

# ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
free -h
cat /proc/meminfo

# ํ”„๋กœ์„ธ์Šค๋ณ„ ๋ฉ”๋ชจ๋ฆฌ
ps aux --sort=-%mem | head
pmap -x <PID>

# ํŽ˜์ด์ง€ ์บ์‹œ ์ƒํƒœ
cat /proc/meminfo | grep -E "Cached|Buffers|Dirty"

# NUMA ๋ฉ”๋ชจ๋ฆฌ
numastat

3.2 Swap ํŠœ๋‹

# swappiness (0-100, ๋‚ฎ์„์ˆ˜๋ก swap ๋œ ์‚ฌ์šฉ)
sysctl -w vm.swappiness=10  # ์„œ๋ฒ„: 10, ๋ฐ์Šคํฌํ†ฑ: 60

# Swap ํŒŒ์ผ ์ƒ์„ฑ
dd if=/dev/zero of=/swapfile bs=1G count=4
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

# /etc/fstab์— ์ถ”๊ฐ€
# /swapfile none swap sw 0 0

# Swap ์ƒํƒœ
swapon --show
cat /proc/swaps

3.3 ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ sysctl

# /etc/sysctl.d/99-memory.conf

# Swap ์‚ฌ์šฉ ์ค„์ด๊ธฐ
vm.swappiness = 10

# ๋”ํ‹ฐ ํŽ˜์ด์ง€ ๋น„์œจ (์“ฐ๊ธฐ ์ง€์—ฐ)
vm.dirty_ratio = 20              # ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ์˜ 20%๊นŒ์ง€ ๋”ํ‹ฐ ํ—ˆ์šฉ
vm.dirty_background_ratio = 5    # 5%์—์„œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”Œ๋Ÿฌ์‹œ ์‹œ์ž‘

# ๋˜๋Š” ์ ˆ๋Œ€๊ฐ’์œผ๋กœ
vm.dirty_bytes = 1073741824      # 1GB
vm.dirty_background_bytes = 268435456  # 256MB

# ์บ์‹œ ์••๋ฐ•
vm.vfs_cache_pressure = 50       # ๊ธฐ๋ณธ 100, ๋‚ฎ์œผ๋ฉด ์บ์‹œ ์œ ์ง€

# OOM Killer ํŠœ๋‹
vm.overcommit_memory = 0         # 0=ํœด๋ฆฌ์Šคํ‹ฑ, 1=ํ•ญ์ƒ ํ—ˆ์šฉ, 2=์ œํ•œ
vm.overcommit_ratio = 50         # overcommit_memory=2์ผ ๋•Œ ์‚ฌ์šฉ

# ๋ฉ”๋ชจ๋ฆฌ ์••์ถ•
vm.compaction_proactiveness = 20

# Transparent Huge Pages
# /sys/kernel/mm/transparent_hugepage/enabled
# [always] madvise never

3.4 ์บ์‹œ ๊ด€๋ฆฌ

# ํŽ˜์ด์ง€ ์บ์‹œ ๋น„์šฐ๊ธฐ (ํ”„๋กœ๋•์…˜์—์„œ ์ฃผ์˜!)
sync
echo 1 > /proc/sys/vm/drop_caches  # ํŽ˜์ด์ง€ ์บ์‹œ
echo 2 > /proc/sys/vm/drop_caches  # dentries, inodes
echo 3 > /proc/sys/vm/drop_caches  # ๋ชจ๋‘

# ํŠน์ • ํŒŒ์ผ ์บ์‹œ ํ™•์ธ
vmtouch -v /path/to/file
fincore /path/to/file

# ํ”„๋กœ์„ธ์Šค๋ณ„ ์บ์‹œ ์‚ฌ์šฉ
cat /proc/<PID>/smaps | grep -E "^(Rss|Shared|Private)"

4. I/O ํŠœ๋‹

4.1 I/O ์Šค์ผ€์ค„๋Ÿฌ

# ํ˜„์žฌ ์Šค์ผ€์ค„๋Ÿฌ ํ™•์ธ
cat /sys/block/sda/queue/scheduler
# [mq-deadline] kyber bfq none

# ์Šค์ผ€์ค„๋Ÿฌ ์ข…๋ฅ˜
# - none: NVMe SSD์šฉ (NOOP)
# - mq-deadline: ๋ฐ๋“œ๋ผ์ธ ๊ธฐ๋ฐ˜, ์„œ๋ฒ„ ๊ธฐ๋ณธ๊ฐ’
# - bfq: Budget Fair Queueing, ๋ฐ์Šคํฌํ†ฑ์šฉ
# - kyber: ๋น ๋ฅธ ์žฅ์น˜์šฉ

# ์Šค์ผ€์ค„๋Ÿฌ ๋ณ€๊ฒฝ
echo mq-deadline > /sys/block/sda/queue/scheduler

# ์˜๊ตฌ ์„ค์ • (GRUB)
# /etc/default/grub
# GRUB_CMDLINE_LINUX="elevator=mq-deadline"
# update-grub

# udev ๊ทœ์น™์œผ๋กœ ์„ค์ •
# /etc/udev/rules.d/60-scheduler.rules
# ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="mq-deadline"
# ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"

4.2 ๋””์Šคํฌ I/O ํŠœ๋‹

# ์ฝ๊ธฐ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ (readahead)
cat /sys/block/sda/queue/read_ahead_kb  # ๊ธฐ๋ณธ 128
echo 256 > /sys/block/sda/queue/read_ahead_kb

# ํ ๊นŠ์ด
cat /sys/block/sda/queue/nr_requests
echo 256 > /sys/block/sda/queue/nr_requests

# ์ตœ๋Œ€ ์„นํ„ฐ
cat /sys/block/sda/queue/max_sectors_kb

# SSD TRIM ํ™œ์„ฑํ™”
fstrim -v /
# ๋˜๋Š” ์ž๋™ TRIM (๋งˆ์šดํŠธ ์˜ต์…˜: discard)
# /dev/sda1 / ext4 defaults,discard 0 1

# ์ •๊ธฐ TRIM (๊ถŒ์žฅ)
systemctl enable fstrim.timer

4.3 ํŒŒ์ผ์‹œ์Šคํ…œ ํŠœ๋‹

# ext4 ๋งˆ์šดํŠธ ์˜ต์…˜
# /etc/fstab
# noatime    - ์ ‘๊ทผ ์‹œ๊ฐ„ ๊ธฐ๋ก ์•ˆ ํ•จ (์„ฑ๋Šฅ ํ–ฅ์ƒ)
# nodiratime - ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ์‹œ๊ฐ„ ๊ธฐ๋ก ์•ˆ ํ•จ
# data=writeback - ์ €๋„๋ง ๋ชจ๋“œ (์œ„ํ—˜ํ•˜์ง€๋งŒ ๋น ๋ฆ„)
# barrier=0  - ์“ฐ๊ธฐ ์žฅ๋ฒฝ ๋น„ํ™œ์„ฑํ™” (์œ„ํ—˜)
# commit=60  - ์ปค๋ฐ‹ ๊ฐ„๊ฒฉ (์ดˆ)

# XFS ํŠœ๋‹
# logbufs=8 - ๋กœ๊ทธ ๋ฒ„ํผ ์ˆ˜
# logbsize=256k - ๋กœ๊ทธ ๋ฒ„ํผ ํฌ๊ธฐ

# ํŒŒ์ผ์‹œ์Šคํ…œ ์ •๋ณด
tune2fs -l /dev/sda1  # ext4
xfs_info /dev/sda1    # XFS

4.4 I/O ์šฐ์„ ์ˆœ์œ„

# ionice - I/O ์šฐ์„ ์ˆœ์œ„
ionice -c 3 command        # Idle
ionice -c 2 -n 0 command   # Best-effort, ๋†’์€ ์šฐ์„ ์ˆœ์œ„
ionice -c 1 command        # Realtime (root๋งŒ)

# ์‹คํ–‰ ์ค‘ ํ”„๋กœ์„ธ์Šค ๋ณ€๊ฒฝ
ionice -c 2 -n 7 -p <PID>  # ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„๋กœ

# ํ˜„์žฌ I/O ์šฐ์„ ์ˆœ์œ„ ํ™•์ธ
ionice -p <PID>

5. ๋„คํŠธ์›Œํฌ ํŠœ๋‹

5.1 ๋„คํŠธ์›Œํฌ ์ •๋ณด ํ™•์ธ

# ์ธํ„ฐํŽ˜์ด์Šค ์ •๋ณด
ip link show
ethtool eth0

# ๋„คํŠธ์›Œํฌ ํ†ต๊ณ„
ss -s
netstat -s
cat /proc/net/netstat

# ์—ฐ๊ฒฐ ์ƒํƒœ
ss -tuln   # ๋ฆฌ์Šค๋‹ ํฌํŠธ
ss -tupn   # ๋ชจ๋“  ์—ฐ๊ฒฐ
conntrack -L  # ์—ฐ๊ฒฐ ์ถ”์  ํ…Œ์ด๋ธ”

5.2 TCP ํŠœ๋‹

# /etc/sysctl.d/99-network.conf

# TCP ๋ฒ„ํผ ํฌ๊ธฐ
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576

# TCP ์†Œ์ผ“ ๋ฒ„ํผ (min, default, max)
net.ipv4.tcp_rmem = 4096 1048576 16777216
net.ipv4.tcp_wmem = 4096 1048576 16777216

# TCP ๋ฐฑ๋กœ๊ทธ
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535

# TIME_WAIT ์ตœ์ ํ™”
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1

# TCP Keepalive
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 3

# TCP ํ˜ผ์žก ์ œ์–ด
net.ipv4.tcp_congestion_control = bbr  # ๋˜๋Š” cubic
net.core.default_qdisc = fq

# ํฌํŠธ ๋ฒ”์œ„
net.ipv4.ip_local_port_range = 1024 65535

# SYN ์ฟ ํ‚ค (SYN flood ๋ฐฉ์–ด)
net.ipv4.tcp_syncookies = 1

5.3 ๊ณ ์„ฑ๋Šฅ ์›น ์„œ๋ฒ„ ์„ค์ •

# /etc/sysctl.d/99-webserver.conf

# ํŒŒ์ผ ํ•ธ๋“ค ์ œํ•œ
fs.file-max = 2097152
fs.nr_open = 2097152

# ๋„คํŠธ์›Œํฌ ์Šคํƒ
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535

# ๋ฒ„ํผ
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 12582912 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216

# TCP ์ตœ์ ํ™”
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_mtu_probing = 1

# BBR
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq

5.4 ์—ฐ๊ฒฐ ์ œํ•œ

# ์‹œ์Šคํ…œ ์ œํ•œ
ulimit -n        # ํ˜„์žฌ ์ œํ•œ
ulimit -n 65535  # ๋ณ€๊ฒฝ

# /etc/security/limits.conf
# * soft nofile 65535
# * hard nofile 65535

# systemd ์„œ๋น„์Šค ์ œํ•œ
# [Service]
# LimitNOFILE=65535

6. ํ”„๋กœํŒŒ์ผ๋ง ๋„๊ตฌ

6.1 perf ๊ธฐ๋ณธ

# perf ์„ค์น˜
apt install linux-tools-common linux-tools-$(uname -r)

# CPU ํ”„๋กœํŒŒ์ผ๋ง
perf stat ./my-program
perf stat -d ./my-program  # ์ƒ์„ธ

# ์ƒ˜ํ”Œ๋ง
perf record -g ./my-program
perf record -g -p <PID> -- sleep 30

# ๊ฒฐ๊ณผ ๋ถ„์„
perf report
perf report --stdio

# ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
perf top
perf top -p <PID>

# ์‹œ์Šคํ…œ ์ „์ฒด
perf record -a -g -- sleep 10

6.2 Flamegraph

# FlameGraph ๋„๊ตฌ ์„ค์น˜
git clone https://github.com/brendangregg/FlameGraph

# perf๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
perf record -g -p <PID> -- sleep 60

# Flamegraph ์ƒ์„ฑ
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > flame.svg

# ๋˜๋Š” ํ•œ ๋ฒˆ์—
perf record -F 99 -a -g -- sleep 60
perf script | \
  ./FlameGraph/stackcollapse-perf.pl | \
  ./FlameGraph/flamegraph.pl > flame.svg

6.3 strace/ltrace

# ์‹œ์Šคํ…œ ์ฝœ ์ถ”์ 
strace ./my-program
strace -p <PID>

# ํŠน์ • ์‹œ์Šคํ…œ ์ฝœ๋งŒ
strace -e open,read,write ./my-program

# ์‹œ๊ฐ„ ์ธก์ •
strace -T ./my-program    # ๊ฐ syscall ์‹œ๊ฐ„
strace -c ./my-program    # ์š”์•ฝ ํ†ต๊ณ„

# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝœ ์ถ”์ 
ltrace ./my-program

6.4 ๊ธฐํƒ€ ๋„๊ตฌ

# bpftrace - eBPF ๊ธฐ๋ฐ˜ ์ถ”์ 
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("%s %s\n", comm, str(args->filename)); }'

# ๋ฉ”๋ชจ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง (Valgrind)
valgrind --tool=massif ./my-program
ms_print massif.out.*

# CPU ํ”„๋กœํŒŒ์ผ๋ง (Valgrind)
valgrind --tool=callgrind ./my-program
kcachegrind callgrind.out.*

# ๋ฒค์น˜๋งˆํ‚น
stress-ng --cpu 4 --timeout 60s
fio --name=random-write --ioengine=libaio --iodepth=32 --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60

6.5 ์„ฑ๋Šฅ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

#!/bin/bash
# performance-check.sh

echo "=== ์‹œ์Šคํ…œ ์ •๋ณด ==="
uname -a
uptime

echo -e "\n=== CPU ==="
lscpu | grep -E "^(CPU\(s\)|Thread|Core|Model name)"
mpstat 1 1

echo -e "\n=== ๋ฉ”๋ชจ๋ฆฌ ==="
free -h
cat /proc/meminfo | grep -E "^(MemTotal|MemFree|Buffers|Cached|SwapTotal|SwapFree)"

echo -e "\n=== ๋””์Šคํฌ I/O ==="
iostat -x 1 1

echo -e "\n=== ๋„คํŠธ์›Œํฌ ==="
ss -s
cat /proc/net/netstat | grep -E "^(Tcp|Udp)"

echo -e "\n=== ๋กœ๋“œ ํ‰๊ท  ==="
cat /proc/loadavg

echo -e "\n=== Top ํ”„๋กœ์„ธ์Šค (CPU) ==="
ps aux --sort=-%cpu | head -5

echo -e "\n=== Top ํ”„๋กœ์„ธ์Šค (Memory) ==="
ps aux --sort=-%mem | head -5

echo -e "\n=== ์—ด๋ฆฐ ํŒŒ์ผ ์ˆ˜ ==="
cat /proc/sys/fs/file-nr

echo -e "\n=== ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ==="
ss -s

7. ์—ฐ์Šต ๋ฌธ์ œ

์—ฐ์Šต 1: ์›น ์„œ๋ฒ„ ํŠœ๋‹

# ์š”๊ตฌ์‚ฌํ•ญ:
# 1. ๋™์‹œ ์—ฐ๊ฒฐ 10๋งŒ ์ง€์›
# 2. TCP ์ตœ์ ํ™” (BBR, keepalive)
# 3. ํŒŒ์ผ ํ•ธ๋“ค ์ œํ•œ ์ฆ๊ฐ€
# 4. ์ ์ ˆํ•œ I/O ์Šค์ผ€์ค„๋Ÿฌ ์„ ํƒ

# sysctl ์„ค์ • ์ž‘์„ฑ:

์—ฐ์Šต 2: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„ ํŠœ๋‹

# ์š”๊ตฌ์‚ฌํ•ญ:
# 1. ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” (๋‚ฎ์€ swappiness)
# 2. ๋””์Šคํฌ I/O ์ตœ์ ํ™”
# 3. ๋”ํ‹ฐ ํŽ˜์ด์ง€ ๊ด€๋ฆฌ
# 4. CPU ์นœํ™”์„ฑ ์„ค์ •

# ์„ค์ • ๋ฐ ๋ช…๋ น์–ด ์ž‘์„ฑ:

์—ฐ์Šต 3: ์„ฑ๋Šฅ ๋ฌธ์ œ ์ง„๋‹จ

# ์‹œ๋‚˜๋ฆฌ์˜ค:
# ์„œ๋ฒ„๊ฐ€ ๋А๋ ค์กŒ์„ ๋•Œ ์ˆœ์ฐจ์ ์œผ๋กœ ํ™•์ธํ•  ํ•ญ๋ชฉ ์ž‘์„ฑ

# ์ง„๋‹จ ๋ช…๋ น์–ด ๋ชฉ๋ก:

์—ฐ์Šต 4: Flamegraph ๋ถ„์„

# ์š”๊ตฌ์‚ฌํ•ญ:
# 1. CPU ์ง‘์•ฝ์ ์ธ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ ๋˜๋Š” ์„ ํƒ
# 2. perf๋กœ ํ”„๋กœํŒŒ์ผ๋ง
# 3. Flamegraph ์ƒ์„ฑ
# 4. ๋ณ‘๋ชฉ ์ง€์  ๋ถ„์„

# ๋ช…๋ น์–ด ๋ฐ ๋ถ„์„ ๋ฐฉ๋ฒ•:

๋‹ค์Œ ๋‹จ๊ณ„

์ฐธ๊ณ  ์ž๋ฃŒ


โ† ์ด์ „: systemd ์‹ฌํ™” | ๋‹ค์Œ: ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๊ตฌ์กฐ โ†’ | ๋ชฉ์ฐจ

to navigate between lessons