系统调优-5(分析内存)
strace
strace命令是一个集诊断、调试、统计与一体的工具. 查看一个命令或进程在执行中发生了多少次系统调用.
常用用法举例:
strace -c ifconfig # 统计发生了多少次系统调用 strace -c -S calls ifconfig # 以字段 calls 排序显示系统调用 strace -f ls # 统计fork 出的子进程调用 strace -e open ifconfig # 只看open打开系统调用的情况 # 工作中常用的是依据系统pid跟踪程序在做什么 strace -p PID
ltrace
ltrace命令是用来跟踪进程调用库函数的情况。
getconf
getconf 查看系统详细信息
常用用法举例
getconf -a | grep -i cache_size # 查看 CPU 缓存 LEVEL1_ICACHE_SIZE 32768 LEVEL1_DCACHE_SIZE 32768 LEVEL2_CACHE_SIZE 1048576 LEVEL3_CACHE_SIZE 34603008 LEVEL4_CACHE_SIZE 0 [root@wpic ~]# getconf -a | grep -i page_size # 查看内存页大小 PAGE_SIZE 4096
CPU 缓存调度
数据存储单位
CPU:line
MEMORY: page
DISK : block
一致性内存访问
write-through :一级一级缓存写,直到写到磁盘
write-back: 只写到一级缓存,标记数据为 dirty, 然后当一级缓存不够用时再写到二级缓存
CPU 缓存映射方式
- 直接映射缓存
- 全关联映射缓存
- 两路或多路关联映射缓存
[root@emergo ~]# x86info -c # 查看内存映射方式 x86info v1.30. Dave Jones 2001-2011 Feedback to <davej@redhat.com>. Found 2 identical CPUs Extended Family: 0 Extended Model: 4 Family: 6 Model: 79 Stepping: 1 Type: 0 (Original OEM) CPU Model (x86info's best guess): Unknown model. Processor name string (BIOS programmed): Intel(R) Xeon(R) CPU E5-2682 v4 @ 2.50GHz Cache info TLB info Data TLB: 4KB pages, 4-way associative, 64 entries Data TLB: 4KB pages, 4-way associative, 64 entries 64 byte prefetching. Found unknown cache descriptors: 63 76 b5 c3 ff Total processor threads: 2 This system has 1 single-core processor with hyper-threading (2 threads per core) running at an estimated 2.50GHz
检查缓存命中率
valgrind
# 安装 yum install valgrind # 检查命令或脚本的 cpu 缓存命中率 ]# valgrind --tool=cachegrind
内存泄漏
内存分类
- 虚拟内存 page
- 物理内存 page frames
应用程序调用内存
- 申请虚拟内存,每个进程都会有自己的虚拟内存空间
- 程序运行时分配物理内存
内存泄漏
- 内存泄漏处理方法
发现内存泄漏后,只能 kill 内存泄漏的进程,或这个重启进程
- 测试内存泄漏
valgrind --tool=memcheck ls # 检查 ls 命令在执行过程中是否存在内存泄漏
- 内存泄漏的两种情况
1. 虚拟内存增大,物理内存不怎么变化
2. 虚拟内存和物理内存同时增大
- 监控内存变化
watch -n 1 free -m # 1 秒钟收集一次
watch -n 1 'free -m;grep Committed_AS' /proc/meminfo # 从内存中读取文件信息
内存溢出 OOM
当物理内存耗尽之后,进程无法申请新的物理内存,就后导致内存溢出.
内存溢出操作系统处理流程
- 系统 OOM killer 程序,会选择性的杀掉一部分进程
- OOM 内核参数 cat /proc/sys/vm/panic_on_oom 0 :启动 OOM killer 程序 1:引发内核恐慌。 默认为 0.
OOM killer 程序
OOM killer 程序依据每个进程的参数值大小决定kill 那个进程
例如:进程号为 1 的进程参数 /proc/1/oom_adj
oom_adj 取值范围: -17-15 ,值越小越不容易被杀掉。
手动触发一次 OOM killer: echo f > /proc/sysrq-trigger

浙公网安备 33010602011771号