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  

:可以被每个CPU缓存的最大对象数

:一次性最多可以传送多少个CPU缓存对象

:在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]

调优思路:

性能指标:定位瓶颈

调优