14. Linux ์ฑ๋ฅ ํ๋
14. Linux ์ฑ๋ฅ ํ๋¶
ํ์ต ๋ชฉํ¶
- ์์คํ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋ฐ ๋ถ์
- sysctl์ ํตํ ์ปค๋ ํ๋ผ๋ฏธํฐ ์ต์ ํ
- CPU, ๋ฉ๋ชจ๋ฆฌ, I/O ์ฑ๋ฅ ํ๋
- perf์ flamegraph๋ฅผ ํ์ฉํ ํ๋กํ์ผ๋ง
๋ชฉ์ฐจ¶
- ์ฑ๋ฅ ๋ถ์ ๊ธฐ์ด
- CPU ํ๋
- ๋ฉ๋ชจ๋ฆฌ ํ๋
- I/O ํ๋
- ๋คํธ์ํฌ ํ๋
- ํ๋กํ์ผ๋ง ๋๊ตฌ
- ์ฐ์ต ๋ฌธ์
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. ๋ณ๋ชฉ ์ง์ ๋ถ์
# ๋ช
๋ น์ด ๋ฐ ๋ถ์ ๋ฐฉ๋ฒ:
๋ค์ ๋จ๊ณ¶
- 15_์ปจํ ์ด๋_๋ด๋ถ_๊ตฌ์กฐ - cgroups, namespaces
- 16_์ ์ฅ์_๊ด๋ฆฌ - LVM, RAID
- Brendan Gregg's Blog
์ฐธ๊ณ ์๋ฃ¶
โ ์ด์ : systemd ์ฌํ | ๋ค์: ์ปจํ ์ด๋ ๋ด๋ถ ๊ตฌ์กฐ โ | ๋ชฉ์ฐจ