process:一个独立运行的单位
资源:CPU资源,内存资源
CPU:
时间:切片
缓存:缓存当前程序的数据
内存:
空间:映射
线性地址 <---- 物理地址
线性地址:进程运行时认为自己可使用的空间
物理地址:实际内存的空间
进程描述符:
进程元数据
通过一个双向链表(C语言中的struct)描述
Linux:抢占
系统时钟:时钟
tick:滴答
时间解析度
进程类别:
交互式进程:I/O密集型
批处理进程:CPU密集型
实时(Real-time)进程
CPU密集型:时间片长,优先级低
I/O密集型:时间片短,优先级高
Linux优先级:priority
实时优先级:1--99,数字越小,优先级越低
top中RT表示实时优先级
静态优先级:100-139,数字越小,优先级越高;用于描述用户空间进程的优先级
实时优先级比静态优先级高
nice值:调整静态优先级
查看进程调度类型、优先级
# ps -e -o class,rtprio,pri,nice,cmd
CLS RTPRIO PRI NI CMD
TS - 19 0 /sbin/init
TS - 19 0 [kthreadd]
FF 99 139 - [migration/0]
TS - 19 0 [ksoftirqd/0]
FF 99 139 - [migration/0]
FF 99 139 - [watchdog/0]
中括号代表是内核线程
调度类别:
实时优先级:
SCHED_FIFO:First In First Out FF
SCHED_RR: RoundRobin RR
100---139:
SCHED_Other: 用来调度100-139(用户空间进程)之间的进程 TS
动态优先级:
对于长时间没有获得CPU时间片的进程,会临时调高其优先级
dynamic_priority=max(100,min( static_priority-bonus+5,139))
bonus: 0-10
手动调整优先级:
100---139(用户空间进程优先级):通过nice值调整
nice N COMMAND
renice -n # PID
1---99(实时进程优先级):
通过chrt命令调整
chrt [options] prio command 进程启动时指定其优先级
chrt [options] -p [prio] pid 调整已启动的进程优先级
-f, --fifo
set scheduling policy to SCHED_FIFO
-r, --rr
set scheduling policy to SCHED_RR (the default)
SMP:
对称多处理器,多颗CPU内存共享
NUMA:
每个CPU有自己独立的内存空间
CPU affinity:CPU绑定
将某些进程绑定在一个CPU上运行,避免交叉内存访问
# numastat
node0
numa_hit 310693
numa_miss 0
numa_foreign 0
interleave_hit 13609
local_node 310693
other_node 0
numa_hit:CPU在本地内存上查找数据时的命中率
numa_miss:CPU在本地内存上查找数据时的丢失率
numa_foreign:某CPU的本地内存数据第1次就被其他CPU访问
numastat选项:
-p PID: 查找指定进程的内存分配
-s NODE: 查看某个NODE的信息
# numastat -s node0
Found no processes containing pattern: "node0"
Per-node numastat info (in MBs):
Node 0 Total
--------------- ---------------
Numa_Hit 1227.95 1227.95
Local_Node 1227.95 1227.95
Interleave_Hit 53.16 53.16
Numa_Foreign 0.00 0.00
Numa_Miss 0.00 0.00
Other_Node 0.00 0.00
# numactl
# numad
taskset:绑定进程至某CPU
以mask(十六进制数字)方式引用CPU
0x00000001
is processor #0(第0号CPU)
0x00000003
is processors #0 and #1
0xFFFFFFFF
is all processors (#0 through #31)
将十六进制数转换成二进制数,从右向左看,右侧的第1个数字(值为1的话)表示第0号CPU
# taskset -p mask pid
将PID为101的进程绑定到3号CPU
# taskset -p 0x00000004 101
或者
# taskset -p -c 3 101
-c:用于指定CPU编号
应该将中断绑定至那些非隔离的CPU上,从而避免那些隔离的CPU处理中断
方法:
echo CPU_MASK > /proc/irq/irq_number/smp_affinity
查看CPU使用率命令
1、sar 查看CPU平均负载
每1秒显示一次CPU使用率
# sar -q 1
Linux 2.6.32-431.el6.x86_64 (localhost.localdomain) 2016年01月26日 _x86_64_ (1 CPU)
00时13分42秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
00时13分43秒 0 201 0.00 0.00 0.00
00时13分44秒 0 201 0.00 0.00 0.00
00时13分45秒 0 201 0.00 0.00 0.00
00时13分46秒 0 201 0.00 0.00 0.00
00时13分47秒 0 201 0.00 0.00 0.00
runq-sz:运行队列的长度
plist-sz:当前进程的个数
2、top
3、w
4、uptime
5、mpstat 1
6、iostat
7、dstat -c
查看上下文切换的平均次数,及进程创建创建的平均值
# sar -w 1
内存子系统组件:
slab allocator
buddy system
kswapd
pdflush
mmu
Memory:
TLB:提升性能
启用HugePages
方法1:配置内核参数
# sysctl -w vm.nr_hugepages=10
vm.nr_hugepages = 10
# cat /proc/meminfo | grep -i Huge
AnonHugePages: 0 kB
HugePages_Total: 10
HugePages_Free: 10
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
方法2:
配置Hugetlbfs文件系统
# mkdir /pagehuges
# mount -t hugetlbfs none /pagehuges
strace命令:用于追踪某个进程产生的系统调用
监控准备打开进程的系统调用
# strace cat /etc/fstab
# strace -c cat /etc/fstab
-c:显示每个系统调用的分析结果
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
74.44 0.000067 67 1 write
25.56 0.000023 8 3 mprotect
0.00 0.000000 0 3 read
0.00 0.000000 0 4 open
0.00 0.000000 0 6 close
0.00 0.000000 0 5 fstat
0.00 0.000000 0 9 mmap
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 1 1 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 1 arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00 0.000090 38 1 total
-o:将追踪结果保存至文件中,以供后续分析使用
监控已经启动进程的系统调用
# strace -p PID
内存优化:
1、尽可能避免小内存对象的开销 (slab)
2、降低慢速子系统的服务时间
FileSystem metadata: buffer cache
Disk IO: page cache
Interprocess communication: shared memory
Network: buffer cache,arp cache,connection tracking
调整页面参数
1、vm.min_free_kbytes
磁盘速度过慢,将此参数值调小
CPU性能比较差,将此参数值调小
2、vm.overcommit_memory 调整内存的过量使用
0:由内核决定如何过量使用
1:总是可以过量使用,在数据库服务器上尽可能不使用swap
2:所用内存空间可以大于物理内存(占用swap)
vm.overcommit_ratio:用于定义可以超出物理内存的百分比
建议不要超过50%,不要超出swap+物理内存大小
物理内存的过量使用是以swap为前提的
可以超出物理内存一部分
调优slab cache
调大slab cache可提升CPU处理内存小对象的性能
# cat /proc/slabinfo
tunables <limit> <batchcount> <sharedfactor>
<limit>:可以被每个CPU缓存的最大对象数
<batchcount>:一次性最多可以传送多少个CPU缓存对象
<sharedfactor>:在SMP中,各CPU中可共享多少个缓存
调整方法:
在/proc/slabinfo文件中找到对应对象的名称,通过输出重定向,依次提供3个值即可:
# echo 'ext4_inode_cache 108 54 8' > /proc/slabinfo
# slabtop
调优arp cache
默认情况下,arp的结果全部缓存在/proc/net/arp文件中,此文件的软限制为512,硬限制为1024
在网络节点较大的环境中,需要调整此参数
net.ipv4.neigh.default.gc_thresh1
当arp缓存条目小于128时,内核中的垃圾回收器不予处理
net.ipv4.neigh.default.gc_thresh2
软限制数目 默认512
net.ipv4.neigh.default.gc_thresh3
硬限制数目,默认为1024
net.ipv4.neigh.default.gc_interval
每隔几秒钟清除过期条目
调优page cache(用于降低磁盘IO,加速读操作)
vm.lowmem_reserve_ratio
当内存很低时,预留page cache的空间
vm.vfs_cahce_pressure
定义内核在什么时候回收缓存目录或者inode对象的内存
默认为100
0表示不回收dentries和inodes内存,有可能导致内存溢出
1--99:倾向于不回收
100:倾向性与page cache和swap cache相同
100+:更倾向于回收
vm.page-cluster
如果有需要将内存中的页面转到swap内存中,用于定义一次×××换多少个页面 ;
使用指数定义 2^n ,默认为3,也就是说一次×××换8个页面
如果需要过多使用swap分区,可以调整此参数,一般不要大于4
在虚拟化环境中,经常调整
vm.zone_reclaim_mode
定义更倾向于回收哪一段的内存
1:打开回收功能
2:回收写操作产生的脏页
4:回收用于swap page的页面
Anonymous pages:
程序数据,堆中的数据
匿名内存区域
映射为进程私有页面的脏页面
进程间通信的共享内存页面
Anonymous pages = RSS-shared
RSS:实际内存集
进程间通信机制:
消息:messages
信号:semaphores
共享内存:shared memory
进程间通信管理命令:
1、查看三种机制的值
# ipcs -l
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 67108864
max total shared memory (kbytes) = 17179869184
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
------ Messages: Limits --------
max queues system wide = 958
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536
2、当进程卡死时,可结束进程
# ipcrm
调整参数:
1、共享内存 shm
kernel.shmmni
在全系统范围内,最大允许使用多少个共享内存段
默认为4096
kernel.shmall
在全系统范围内,一次性可以使用的最大共享内存页面数
默认为2097152
kernel.shmmax
单个共享内存段的最大上限
2、消息messages
kernel.msgmnb
单个消息队列的最大上限,单位为字节
默认为16384
kernel.msgmni
消息队列的个数最大上限
默认为16
kernel.msgmax
进程间通信时,所能使用的单个消息的最大上限,单位为字节
默认为8192
调整pdflush回收内存脏页
vm.nr_pdflush_threads:用于显示当前启动了多少个pdflush进程个数
# cat /proc/sys/vm/nr_pdflush_threads
0
按照块设备,一块磁盘一个pdflush进程
rhel 6会自动调整pdflush进程个数
vm.dirty_background_ratio
相对于总内存来说,脏页面占多少比例后开始启动清理
# cat /proc/sys/vm/dirty_background_ratio
10
vm.dirty_ratio:
对于单个进程来说,脏页面占多少比例后开始启动清理
# cat /proc/sys/vm/dirty_ratio
20
vm.dirty_expire_centisecs
pdflush周期性启动清理的时间间隔,单位为百分秒
vm.dirty_writeback_centisecs
脏页在内存中存储多久后过期,需要立即启动清理;单位为百分秒
手动清写脏缓存和脏缓冲
sync
echo s > /proc/sysrq-trigger
echo 3 > /proc/sys/vm/drop_caches
1: 翻放pagecache
2:释放dentries和inodes
3:释放pagecache,dentries,inodes
# free -m
total used free shared buffers cached
Mem: 482 464 18 0 34 265
-/+ buffers/cache: 163 318
Swap: 2199 0 2199
# sync
# free -m
total used free shared buffers cached
Mem: 482 464 18 0 34 265
-/+ buffers/cache: 163 318
Swap: 2199 0 2199
# echo 1 > /proc/sys/vm/drop_caches
# free -m
total used free shared buffers cached
Mem: 482 173 308 0 0 14
-/+ buffers/cache: 159 323
Swap: 2199 0 2199
/proc/sys/vm/panic_on_oom
0:当内存耗尽时,启动oom(out-of-memory)
1:表示禁用oom killer
oom_score:
-16--15:协助计算oom_score
oom_adj
-17:禁止杀死该进程
使用valgrind评估内存泄露
# valgrind [valgrind-options] [your-program] [your-program-options]
# valgrind --tool=memcheck cat /proc/$$/maps
$$:当前进程ID
# watch -n 1 'ps axo pid,comm,rss,vsize | grep httpd'
rss,vsize只增不减,有可能为内存泄露
# sar -R 1 120
提高swap性能
1、降低swap think time,使用小swap分区
2、降低访问次数
增大物理内存
使用多个swap分区,在多块硬盘上创建出多个swap分区
3、降低服务时间
使用快速设备(比如ssd磁盘)
将swap放在磁盘的最外道分区
调整使用swap的概率
vm.swappiness
% of memory mapped into page tables+vm.swappiness >= 100
系统调优方面
进程管理,CPU
内存调优
I/O
文件系统
网络子系统
swap size:
科学运算服务器:4*RAM
Database Server: <=1GB
Application Server: >=0.5GB
调优swap性能:
1、在多个磁盘上创建多个swap分区
/dev/sda1 swap swap pri=5 0 0
/dev/sdb1 swap swap pri=5 0 0
监控内存状态
1、vmstat -n [interval] [count]
2、sar -r [interval] [count]
3、sar -R [interval] [count]
4、sar -W [interval] [count]
5、sar -B [interval] [count]
调优思路:
性能指标:定位瓶颈
调优