锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

性能之巅节选

时间:2022-10-25 20:30:01 pfs系列模块化压力变送器双向转换磁电式速度传感器sz3rt电容切换专用接触器流量传感器rfs型流量传感器cpc5623a集成电路

http://www.51pptmoban.com/sucai/3689.html
http://www.51pptmoban.com/sucai/3220.html
http://www.51pptmoban.com/sucai/2047.html

!/bin/bash

/usr/bin/cd /wls/apache/appsystems/tm_sbtps-jzyy-biz/apps

cpu

uptime
vmstat
procs:procs 中有 r 和 b 列,它报告进程统计信息。在上面的输出中,在运行队列(r)等待的过程有两个 CPU 零休眠过程(b)。通常,它不应超过处理器(或核心)的数量,如果发现异常,最好使用 top 命令进一步消除故障。
r:等待运行过程数。
b:休眠状态下的过程数。
memory: memory 报告告内存统计 swpd、free、buff 和 cache 列。你可以用 free -m 命令看到相同的信息。在上述内存统计中,统计数据以千字节表示,这有点难以理解,最好添加 M 以兆字节为单位兆字节为单位的统计数据。
swpd:使用的虚拟内存量。
free:空闲内存。
buff:作为缓冲区的内存。
cache:内存用于高速缓存。
inact:非活动内存的数量。
active:活动内存。
swap:swap 有 si 和 so 列,用于报告交换内存统计信息。您可以使用它 free -m 命令看到相同的信息。
si:从磁盘交换的内存(从 swap 内存移动到实际内存)。
so:从实际内存移动到磁盘的内存(替换) swap 的内存)。
I/O:I/O 有 bi 和 bo 列,它以块读取和块写入的单位报告每秒磁盘读取和写入的块的统计信息。如果你发现有巨大的 I/O 读写,最好用 iotop 和 iostat 命令来查看。
bi:从块设备接收的块数。
bo:块数发送到块设备。
system:system 有 in 和 cs 每秒报告系统操作。
in:包括时钟中断在内的每秒系统中断。
cs:上下文切换的数量是为了处理所有任务。
CPU:CPU 有 us、sy、id 和 wa 列,报告(使用) CPU 资源占总 CPU 时间百分比。如发现异常,最好使用 top 和 free 命令。
us:处理器在非内核程序中消耗时间。
sy:内核相关任务中处理器消耗的时间。
id:空闲时间处理器。
wa:处理器在等待IO以继续处理任务的时间完成操作。
mpstat

参数  释义  从/proc/stat获得数据 CPU 处理器ID    %usr    在internal用户态在时间段内CPU不包括时间(%) nice值为负进程    usr/total*100 %nice   在internal时间段里,nice值为负过程CPU时间(%)    nice/total*100 %sys    在internal核心时间(%)在时间段内   system/total*100 %iowait 在internal时间段里,硬盘IO等待时间(%)   iowait/total*100 %irq    在internal硬中断时间(%)在时间段内  irq/total*100 %soft   在internal时间段里,软中断时间(%)  softirq/total*100 %steal  在服务另一个虚拟处理器时,显示虚拟机管理器CPU在非自愿等待下花费时间的百分比   steal/total*100 %guest  显示运行虚拟处理器时显示CPU花费时间的百分比   guest/total*100 %gnice      gnice/total*100 %idle   在internal时间段里,CPU除去等待磁盘IO由于任何原因,操作外的闲置时间(%)    idle/total*100 

sar
sar 命令格式如下:
sar [ -A ] [ -b ] [ -B ] [ -c ] [ -d ] [ -i interval ] [ -p ] [ -q ]
[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]
[ -x { pid | SELF | ALL } ] [ -X { pid | SELF | ALL } ]
[ -I { irq | SUM | ALL | XALL } ] [ -P { cpu | ALL } ]
[ -o [ filename ] | -f [ filename ] ]
[ -s [ hh:mm:ss ] ] [ -e [ hh:mm:ss ] ]
[ interval [ count ] ]
其中:
interval : 取样时间间隔
count : 为输出次数,如果省略此项,默认值为 1
常用选项:
选项 说明
-A 等价于 -bBcdqrRuvwWy -I SUM -I XALL -n ALL -P ALL
-b 显示I/O统计信息和传输速率
-B 输出内存页面的统计信息
-c 输出过程统计信息,每秒创建的过程数
-d 输出每个块设备的活动信息
-i interval 指定间隔时间为秒
-p 显示友好设备,还可以显示友好设备的名称-d 和-n 例如,结合使用参数 -dp 或-np
-q 统计输出过程队列长度和平均负载状态
-r 统计信息输出内存和交换空间
-R 输出内存页面的统计信息
-t 读取 /var/log/sa/saDD 如果用户的本地时间没有此参数,则显示记录的原始时间
-u 输出CPU统计信息的使用
-v 输出inode、统计信息的文件和其他内核表
-V 输出版本号信息
-w 输出系统交换活动信息
-W 输出系统交换的统计信息
-y 输出TTY设备的活动信息
-n {DEV|EDEV|NFS|NFSD|SOCK|ALL} 网络设备状态统计信息分析输出。
DEV 网络设备统计信息报告
EDEV 报告网络设备的错误统计信息
NFS 报告 NFS 客户端活动统计信息
NFSD 报告 NFS 服务器活动统计信息
SOCK 报告网络套接字(sockets)统计信息的使用
ALL 报告各类网络活动统计信息
-x {pid|SELF|ALL} 输出指定进程的统计信息。
pid 用 pid 指定具体过程
SELF 表示 sar 自身
ALL 表示所有过程
-X {pid|SELF|ALL} 子过程输出指定过程的统计信息
-I {irq|SUM|ALL|XALL} 输出指定中断的统计信息。
irq 指定中断号
SUM 每秒接收指定输出的中断总数
ALL 指定输出前16个中断
XALL 所有指定输出的中断信息
-P {cpu|ALL} 输出指定 CPU 的统计信息
-o filename 将输出信息保存到文件中 filename
-f filename 从文件 filename 读取数据信息。filename 是使用-o 选项生成的文件。
-s hh:mm:ss 指定输出统计数据的开始时间
-e hh:mm:ss 默认情况下,指定输出统计数据的截止日期为18:00:00
sar 使用举例

怀疑CPU有瓶颈,可用 sar -u 和 sar -q 等来查看  怀疑内存有瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看  怀疑I/O有瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看 

ps
ps命令常用法(方便查看系统过程)

1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。 2)ps -A 显示所有过程。 3)ps c 在列出程序时,显示每个程序的真实指令名称,而不包括路径、参数或常驻服务。 4)ps -e 该参数的效果及指定A相同的参数。 5)ps e 在列出程序时,显示每个程序使用的环境变量。 6)ps f 用ASCII字符显示树结构,表示程序之间的关系。 7)ps -H 显示树结构,表示程序之间的相互关系。 8)ps -N 除了执行所有程序外,显示所有程序ps除了指示终端下的程序。 9)ps s 程序状态采用程序信号格式显示。 10)ps S 列出程序时,包括已中断的子程序数据。 11)ps -t<终端机编号>  指定终端编号,列出属于终端的程序。 12)ps u  以用户为主的格式显示程序状态。 13)ps x  显示所有程序,不区分终端。  Head头  USER    用户名 UID    用户ID(User ID) PID    进程ID(Process ID) PPID    父亲的过程ID(Parent Process id) SID    会话ID(Session id) %CPU    进程的cpu占用率 %MEM    进程的内存占用率 VSZ    过程中使用的虚存大小(Virtual Size) RSS    停留集或实际内存的大小,Kbytes字节。 TTY    与过程相关的终端(tty) STAT    流程状态:流程状态由字符表示(STAT的状态码) R 运行    Runnable (on run queue)            正在运行或在运行队列中等待。 S 睡眠    Sleeping                休眠中, 受阻, 等待某一条件的形成或接收信号。 S 睡眠    Sleeping                休眠中, 受阻, 等待某一条件的形成或接收信号。 I 空闲    dle
Z 僵死    Zombie(a defunct process)        进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
D 不可中断    Uninterruptible sleep (ususally IO)    收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
T 终止    Terminate                进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
P 等待交换页
W 无驻留页    has no resident pages        没有足够的记忆体分页可分配。
X 死掉的进程
< 高优先级进程                    高优先序的进程
N 低优先    级进程                    低优先序的进程
L 内存页    Lock                有记忆体分页分配并缩在记忆体内
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+ 位于后台的进程组 
START    进程启动时间和日期
TIME    进程使用的总cpu时间
COMMAND    正在执行的命令行命令
NI    优先级(Nice)
PRI    进程优先级编号(Priority)
WCHAN    进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。
FLAGS    与进程相关的数字标识

############################################################

例子:
查看当前系统进程的uid,pid,stat,pri, 以uid号排序.
ps -eo pid,stat,pri,uid –sort uid

查看当前系统进程的user,pid,stat,rss,args, 以rss排序.
ps -eo user,pid,stat,rss,args –sort rss

top

top   //每隔5秒显式所有进程的资源占用情况
top -d 2  //每隔2秒显式所有进程的资源占用情况
top -c  //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
total 进程总数
running 正在运行的进程数
sleeping 睡眠的进程数
stopped 停止的进程数
zombie 僵尸进程数
Cpu(s): 
0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0%hi:硬件CPU中断占用百分比
0.0%si:软中断占用百分比
0.0%st:虚拟机占用百分比
atop


序号  列名    含义
a    PID     进程id
b    PPID    父进程id
c    RUSER   Real user name
d    UID     进程所有者的用户id
e    USER    进程所有者的用户名
f    GROUP   进程所有者的组名
g    TTY     启动进程的终端名。不是从终端启动的进程则显示为 ?
h    PR      优先级
i    NI      nice值。负值表示高优先级,正值表示低优先级
j    P       最后使用的CPU,仅在多CPU环境下有意义
k    %CPU    上次更新到现在的CPU时间占用百分比
l    TIME    进程使用的CPU时间总计,单位秒
m    TIME+   进程使用的CPU时间总计,单位1/100秒
n    %MEM    进程使用的物理内存百分比
o    VIRT    进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
p    SWAP    进程使用的虚拟内存中,被换出的大小,单位kb。
q    RES     进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
r    CODE    可执行代码占用的物理内存大小,单位kb
s    DATA    可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
t    SHR     共享内存大小,单位kb
u    nFLT    页面错误次数
v    nDRT    最后一次写入到现在,被修改过的页面数。
w    S       进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
x    COMMAND 命令名/命令行
y    WCHAN   若该进程在睡眠,则显示睡眠中的系统函数名
z    Flags   任务标志,参考 sched.h

prstat

pidstat
linux:~ # pidstat -r -p 13084 1
Linux 2.6.32.12-0.7-default (linux) 06/18/12 x86_64

15:08:18          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
15:08:19        13084 133835.00      0.00 15720284 15716896  96.26  mmmm
15:08:20        13084  35807.00      0.00 15863504 15849756  97.07  mmmm
15:08:21        13084  19273.87      0.00 15949040 15792944  96.72  mmmm

minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
VSZ:      该进程使用的虚拟内存(以kB为单位)
RSS:      该进程使用的物理内存(以kB为单位)
%MEM:     该进程使用内存的百分比
Command:  拉起进程对应的命令


linux:~ # pidstat -d 1 2
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

17:11:36          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
17:11:37        14579 124988.24      0.00      0.00  dd

17:11:37          PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
17:11:38        14579 105441.58      0.00      0.00  dd
kB_rd/s: 每秒进程从磁盘读取的数据量(以kB为单位)
kB_wr/s: 每秒进程向磁盘写的数据量(以kB为单位)
Command: 拉起进程对应的命令
linux:~ # pidstat -r -p 1 1
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_

18:26:17          PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
18:26:18            1      0.00      0.00   10380    640   0.00  init
18:26:19            1      0.00      0.00   10380    640   0.00  init

pidstat -u 1

pidstat -r 1

pidstat -d 1

time
使用方式: time [options] COMMAND [arguments]
说明: time 指令的用途,在于量测特定指令执行时所需消耗的时间及系统资源等资讯。例如 CPU 时间、记忆体、输入输出等等。需要特别注意的是,部分资讯在 Linux 上显示不出来。这是因为在 Linux 上部分资源的分配函式与 time 指令所预设的方式并不相同,以致于 time 指令无法取得这些资料。
参数:
-o or –output=FILE
设定结果输出档。这个选项会将 time 的输出写入 所指定的档案中。如果档案已经存在,系统将覆写其内容。
-a or –append
配合 -o 使用,会将结果写到档案的末端,而不会覆盖掉原来的内容。
-f FORMAT or –format=FORMAT
以 FORMAT 字串设定显示方式。当这个选项没有被设定的时候,会用系统预设的格式。不过你可以用环境变数 time 来设定这个格式,如此一来就不必每次登入系统都要设定一次。
一般设定上,你可以用
’ ’
表示跳栏,或者是用


表示换行。每一项资料要用 % 做为前导。如果要在字串中使用百分比符号,就用 。(学过 C 语言的人大概会觉得很熟悉)
time 指令可以显示的资源有四大项,分别是:
Time resources
Memory resources
IO resources
Command info
详细的内容如下:
Time Resources
E 执行指令所花费的时间,格式是:[hour]:minute:second。请注意这个数字并不代表实际的 CPU 时间。
e 执行指令所花费的时间,单位是秒。请注意这个数字并不代表实际的 CPU 时间。
S 指令执行时在核心模式(kernel mode)所花费的时间,单位是秒。
U 指令执行时在使用者模式(user mode)所花费的时间,单位是秒。
P 执行指令时 CPU 的占用比例。其实这个数字就是核心模式加上使用者模式的 CPU 时间除以总时间。
Memory Resources
M 执行时所占用的实体记忆体的最大值。单位是 KB
t 执行时所占用的实体记忆体的平均值,单位是 KB
K 执行程序所占用的记忆体总量(stack+data+text)的平均大小,单位是 KB
D 执行程序的自有资料区(unshared data area)的平均大小,单位是 KB
p 执行程序的自有堆叠(unshared stack)的平均大小,单位是 KB
X 执行程序间共享内容(shared text)的平均值,单位是 KB
Z 系统记忆体页的大小,单位是 byte。对同一个系统来说这是个常数
IO Resources
F 此程序的主要记忆体页错误发生次数。所谓的主要记忆体页错误是指某一记忆体页已经置换到置换档(swap file)中,而且已经分配给其他程序。此时该页的内容必须从置换档里再读出来。
R 此程序的次要记忆体页错误发生次数。所谓的次要记忆体页错误是指某一记忆体页虽然已经置换到置换档中,但尚未分配给其他程序。此时该页的内容并未被破坏,不必从置换档里读出来
W 此程序被交换到置换档的次数
c 此程序被强迫中断(像是分配到的 CPU 时间耗尽)的次数
w 此程序自愿中断(像是在等待某一个 I/O 执行完毕,像是磁碟读取等等)的次数
I 此程序所输入的档案数
O 此程序所输出的档案数
r 此程序所收到的 Socket Message
s 此程序所送出的 Socket Message
k 此程序所收到的信号 ( Signal )数量
Command Info
C 执行时的参数以及指令名称
x 指令的结束代码 ( Exit Status )
-p or –portability
这个选项会自动把显示格式设定成为:
real %e
user %U
sys %S
这么做的目的是为了与 POSIX 规格相容。
-v or –verbose
这个选项会把所有程序中用到的资源通通列出来,不但如一般英文语句,还有说明。对不想花时间去熟习格式设定或是刚刚开始接触这个指令的人相当有用。

ptime
dtrace
systemtap
perf
cpustat

usr - 用户模式运行时间占 CPU 百分比的 min/avg/max 值。
sys - 系统模式运行时间占 CPU 百分比的 min/avg/max 值。
nice - 用户模式低优先级运行时间占 CPU 百分比的 min/avg/max 值。
idle - 用户模式空闲时间占 CPU 百分比的 min/avg/max 值。
iowait - 等待磁盘 IO 的 min/avg/max 延迟时间。
prun - 处于可运行状态的 min/avg/max 进程数量(同“平均负载”一样)。
pblock - 被磁盘 IO 阻塞的 min/avg/max 进程数量。
pstat - 在本次汇总间隔里启动的进程/线程数目。
同样还是上面的输出,对于一个进程,不同列的意思分别是:

name - 从 /proc/pid/stat 或 /proc/pid/cmdline 获取的进程名称。
pid - 进程 ID,也被用作 “tgid” (线程组 ID)。
min - 该 pid 的用户模式+系统模式时间的最小样本,取自 /proc/pid/stat。比率是 CPU 的百分比。
max - 该 pid 的用户模式+系统模式时间的最大样本,取自 /proc/pid/stat。
usr - 在汇总期间该 pid 的平均用户模式运行时间,取自 /proc/pid/stat。
sys - 在汇总期间该 pid 的平均系统模式运行时间,取自 /proc/pid/stat。
nice - 表示该进程的当前 “nice” 值,取自 /proc/pid/stat。值越高表示越好(nicer)。
runq - 进程和它所有线程可运行但等待运行的时间,通过 netlink 取自 taskstats。比率是 CPU 的百分比。
iow - 进程和它所有线程被磁盘 IO 阻塞的时间,通过 netlink 取自 taskstats。比率是 CPU 的百分比,对整个汇总间隔平均。
swap - 进程和它所有线程等待被换入(swap in)的时间,通过 netlink 取自 taskstats。Scale 是 CPU 的百分比,对整个汇总间隔平均。
vcx 和 icx - 在汇总间隔期间进程和它的所有线程自动上下文切换总的次数,通过 netlink 取自 taskstats。
rss - 从 /proc/pid/stat 获取的当前 RSS 值。它是指该进程正在使用的内存数量。
ctime - 在汇总间隔期间等待子进程退出的用户模式+系统模式 CPU 时间总和,取自 /proc/pid/stat。 注意长时间运行的子进程可能导致混淆这个值,因为只有在子进程退出后才会报告时间。但是,这对于计算高频 cron 任务以及 CPU 时间经常被多个子进程使用的健康检查非常有帮助。
thrd - 汇总间隔最后线程的数目,取自 /proc/pid/stat。
sam - 在这个汇总间隔期间该进程的样本数目。最近启动或退出的进程可能看起来比汇总间隔的样本数目少。

内存

vmstat
sar
slabtop
::kmstat
ps
top
prstat
pmap
dtrace
systemtap

文件

vfsstat
fsstat
strace truss
dtrace
sarystemtap
latencytop
free
top
vmstat
sar
slabtop
mdb::kmastat
fcachestat
/proc/meninfo
mdb::memstat
kstat

磁盘

iostat
sar
pidstat
dtrace
systemtap
perf
iotop
iosnoop
blktrace
megacli
smartctl

网络

netstat
sar
ifconfig
ip
nicstat
dladm
ping
traceroute
pathchar
tapdump
snoop
wireshark
dtrace
systemtap
perf

控制器是cpu的心脏,运行指令预录取、解码、管理执行以及存储结果
P-cache 预取缓存
W-cache 写缓存
时钟:CPU时钟信号生成器
时间戳计数器:为了高精度时间,由时钟递增
微代码ROM:快速把指令转化成电路信号
温度传感器:温度监控
网络接口:如果集成的芯片

多种硬件缓存往往包含在(包括了片上、晶粒内置、嵌入或者集成)处理器内或者与处理器放在一起。这样通过更快类型的内存缓存了读并缓冲了写

数据缓存 DATA_MEM_REFS 从所有类型内存的读取。对所有类型内存的存储。每一部分被分别计数不包括IO访问或者其他非内存访问
取指令单元 DCU_MISS_OUSTANDING DCU未命中期间的周期权重数,在任意时间每次递增缓存未命中数。公考虑可缓存的读请求
取指令单 IFU_IFETCH 取指令数,可缓存和不可缓存的,包括UC
二级缓存 L2_IFETCH L2取指令数
浮点单元 FLOPS 引退的可计算浮点数操作数
外部总线逻辑 BUS_SNOOP_STALL 总线窥探停滞期间的时钟周期数
指令解码和引退 INST_RETIRED 引退的指令数
中断 HW_INT_RX 收到的硬中断数
分支 BR_MISS_PRED_RETIRED 预测错误分支引退数
停滞 RESOURCE_STALLS 当有与资源相关的停滞时,每个周期递增一次
时钟 CPU_CLK_UNHALTED 处理器未停止期间的周期数

在linux上,分时通过系统时钟中断调用scheduler_tick()实现。这个函数调用调试器类函数管理优先级和称为时间片的CPU时间单位的到期事件。当线程状态变成可运行后,就触发了抢占,调度类函数check_preempt_curr()被调用。线程的切换由__schedule()管理,后者通过pick_next_task()选择最主优先级的线程运行。负载均衡由load_blance()函数负责执行。
高度类管理了可运行线程的行为,特别是它们的优先级,还有CPU时间是否分片,以及这些时间片的长度又称为时间量子。通过高度策略还可以施加其他的控制,在一个高度器内进行选择,控制同一个优先级线程间的高度。

linux高度器类如下:
RT:为实时类负载提供固定的高优先级。内核支持用户和内核级别的抢占,允许RT任务以短延时颁发。
O(1)高度器在Linux2.6作为默认用户进程分时高度器引入。名字来源于算法复杂度,先前的调度器包含了一个遍历所有任务的函数,算法复杂度,这样扩展性就成了问题。相对于CPU消耗型线程,它方式器动态地提高IO消耗型线程的优行级,以降低交互和IO负载的延时
CFS:linux2.6.23引入了完成公平高度作为默认用户进程分时高度器。这个高度器使用红黑树取代了传统运行队列来管理任务。以任务的CPU时间作为键值。这样使得CPU的少量消费者相对于CPU消耗型负载更容易被找到,提高了交互和IO消耗型负载的性能

用户级进程可以通过调度sched_setscheduler()设置高度器策略以调整调度类的行业。RT类支持SCHED_RR 和SCHED_FIFO 策略,而CFS类支持SCHED_NORMAL 和SCHED_BATCH

RR:SCHED_RR是轮转调度。一量一个线程用完了它的时间片,它就被挪到自己优先级运行队列的尾部,这样同等优先级的其他线程可以运行。

FIFO:SCHED_FIFO是一个先进先出调度,一直运动队列头的络直到它自愿退出,或者一个更高优先级的线程抵达。线程会一直运行,即便在运动队列当中存在相同优先级的其他线程。

NORMAL:SCHED_NORMAL是一种分时调度,是用户进程的默认策略。高度器根据高度类动态调整优先级。对于,时间片长度根据静态优先级设置,即更高优先级的工作分配到更长的时间,对于CFS,时间片是动态的。

BATCH:SCHED_BATCH和SCHED_NORMAL类似,但期望线程是CPU消耗型的,这样就不会打断其他IO消耗型交互工作。

NUMA系统上的性能可以通过使用内核感知NUMA而得到 极大提高,因为这样它可以做出更好的高度和内存分配决定。它可以自动检测并创建酝化的CPU和内存资源组,并按照反馈NUMA架构的拓扑结构组织起来。这种结构可以预估任意的内存访问开销。

谁测量、为什么测量、测量什么、如何测量
剖析:剖析构建了研究目标的一幅图像。CPU用量可以通过定期取样CPU的状态进行剖析,按以下步骤进行:
1、选择需要采集的剖析数据以及频率
2、开始每隔一定时间进行取样
3、等待兴趣事件的发生
4、停止取样并收集取样数据
5、处理数据

周期分析:
通过使用CPU性能计数器CPC,我们能够周期级别理解CPU使用率。这可能会展示消耗在一级、二级或者三级缓存未命中,内存IO以及资料IO上的停滞周期,亦或是花浮点操作及其他活动上周期。命运这项信息后,可以通过调整编译器选项或者修改代码 以取得性能收益。

    使用率应该对每个CPU分别监控,以发现线程的扩展性问题。对于实现了CPU限制或者配额的环境,例如云计算环境,还要记录相对于这些限制的CPU用量。
监控CPU用量的一个挑战在于挑选合适的测量和归档时间间隔。

静态性能调优:
1、有多少CPU可用?是核吗?还是硬件线程?
2、CPU缓存的大小是多少?是共享的吗?
3、CPU的架构是单处理还是多处理器?
4、CPU的时钟频率是多少?是动态吗?这些动态特性在BIOS启用了吗?
5、BIOS里启用或禁用了其他什么CPU相关的特性?
6、这款型号的处理器有什么性能问题?出现在处理器勘误一上了吗?
7、这个BIOS固件版本有什么性能问题吗?
8、有软件的CPU使用限制吗?是什么?

CPU绑定:
另一个CPU性能调优的方法是把进程和线程绑定到单个 CPU或一组CPU上。这可以增加进程的CPU缓存温度,提高它的内存IO性能。对NUMA系统这可以提高 内存的本地性,同样也提高性能。
这个方法以下两个方式实现:
1、进程绑定:配置一个进程只跑在单个CPU上,或者预定义CPU组中的一个;
2、独占CPU组:分出一组CPU,让这些CPU只能指定的进程。这可以更大地提升CPU缓存效率,因为当前进程空闲时,其他进程不能使用CPU,保证了缓存的温度。

微型基准测试:
CPU指令:整数运算、浮点操作、内存加载和存储、分支和其他指令。
内存访问:调查不同CPU缓存的延时和主存吞吐量
高级语言:类似CPU指令测试,不过使用高级解释或者编译语言编写
操作系统操作:测试CPU消耗型系统和系统调用函数,例如getpid()和进程创建

uptime 平均负载
vmstat  包括系统范围的CPU平均负载
mpstat 单个CPU统计信息
sar  历史统计信息
ps 进程状态
top 监控每个进程线程CPU用量
pidstat  每个进程线程CPU用量分解
time 给一个命令计时,带CPU用量分析
Dtrace、perf  CPU剖析和跟踪
perf CPU性能计数器分析

ST: 偷取,CPU在虚拟化的环境下在其他租户上的开销
steal:耗费在服务其他租户的时间
guest:花在访客虚拟机的时间

top 顶部是系统范围的统计信息,而下面则是进程、任务的列表,默认按照CPU用量排序。
由于top(1)对/proc拍快照,它会错过一些寿命较短的进程,这些进程在拍快照之前退出。这在软件构建时经常出现,此时CPU被许多构建过程中命的工具牢牢占据。Liunx上有一个top1的变种atop1,使用进程核算技术以捕捉短寿命进程的存在,然后把这些进程加入显示
线程微状态核算统计可通过

pidstat
Linux上的pidstat1工具按进程或线程打印CPU用量,包括用户态和系统态时间的分解。

DTrace
DTrace可以用来剖析用户级和内核级代码的CPU用量,也能够跟踪函数执行、CPU交叉调用、中断和内核调度器。这些功能支持了负载特征分析、剖析、下钻分析和延时分析等活动

单行程序
以997Hz频率取样内核栈:
dtrace -n ‘profile-997 /arg0/ {@[stack()] = count();}’

以997Hz频率取样内核栈,仅输出最频繁的10:
dtrace -n 'profile-997 /arg0/  {@[stack()] = count();} END {trunc(@,10); }'

以997Hz频率取样内核栈,每个栈只输出5帧:
dtrace -n 'profile-997 /arg0/  {@[stack(5)] = count();} }'

以997Hz频率取样在CPU上运行的函数:
dtrace -n 'profile-997 /arg0/  {@[func(arg0)] = count();} }'

以997Hz频率取样在CPU上运行的模块:
dtrace -n 'profile-997 /arg0/  {@[mod(arg0)] = count();} }'

perf已经演化成为一套剖析和跟踪工具,现名为linux性能事件的。每个工具分析作为一个子命令,例如,perf stat执行stat命令,提供基于CPC的统计信息。这些命令的列表可能在USAGE消息中找到

annotate 读取perf.data并显示注释过后代码
diff 赢取两个data文件并显示两份剖析信息之间的差异
evlist 列出一个data文件里的事件名称
inject 过滤以加强事件流,在其中加入额外的信息
kmem 跟踪、测量内核内存slab属性的工具
kvn 跟踪、测量kvm客户机操作系统的工具
list 列出所有的符号事件类型
lock 分析锁事件
probe 定义新的动态跟踪点
record 运行一个命令,并报剖析信息记录在data中
report 读取data并显示剖析信息
sched 跟踪、测量高度器属性的工具
script 读取data并显示跟踪输出
stat 运行一个命令并收集性能计数器统计信息
timechart 可视化某一个负载期间系统总体性能的工具
top 系统剖析工具

系统剖析
perf可以用来剖析CPU调用路径,对CPU时间如何消耗在内核和用户空间进行概括总结。这项工作由record命令完成,该命令以一写间隔进行取样,并导出一一个data文件,然后使用report命令查看文件

在下面的例子里,所有的CPU -a 以997Hz的频率 -F 997 对调用栈 -g 取样10s sleep 10 。选项--stdio 用来打印所有的输出,而非采用默认的交互模式操作

pref record -a -g - F 997 sheep 10

这些取样计数以百分数输出,展示了CPU时间去处。
这些内核和进程符号只在它们的调试信息文件存在的情况下可用,否则只显示十六进制地址

进程剖析
除了剖析系统里的所有CPU,我们也可以对单个进程进行剖析。下面的命令执行了command并创建文件perf.data
perf record -gcommand
和之前一样, perf需要调试信息文件,这样在查看报告时可以进行符号转译

调度器延时器
sched命令记录并报告调度器统计信息
perf sched record sheep 10
上面显示了跟踪时期平均和最大的高度器延时
调度器事件较为频繁,因此此类跟踪会导致 CPU和存储的开销。本例中data文件即为跟踪10s的产物,大小达到了1.7GB。输出中的INFO行表示有些事件被丢弃了。这突显Dtrace在内核过滤和聚合模型的优势:它可以在跟踪时汇总数据并只报汇总结果传递给用户空间,把开销最小化。
stat
stat 命令基于CPC为CPU周期行为提供了一个概要总结。下面的例子里它启动了gzip命令
perf stat gzip file1

进程绑定:
一个进程可以绑定在一个或者多个CPU上,这样可以通过提高缓存温度和内存本地性来提高性能
在Linux上,是通过taskset命令来实现的,这个方法可以使用CPU掩码或者范围设置CPU关联性
task -pc 7-10 10790
上面的设置限定了PID为10790的进程只能跑在CPU7到CPU10之间。

独占CPU组
Linux提供了CPU组,允许编组CPU并为其分配进程。这和进程绑定类似,可以提高性能,但还可以通过使得CPU组独占–不允许其他进程使用–而进一步提高性能。这种权衡另一方面减少了系统其他部分的可用CPU数量。

资源控制
除了把进程和整个CPU关联以外,现代操作系统还对CPU用量分配提供了细粒度资源控制。
Linux上的控制组cgroups,通过进程或者进程组控制了资源用量。CPU用量可以使用份额进行控制,而CFS调度器允许对每段时间内分配的CPU微秒数周期,设置固定上限(CPU带宽)

处理器选项
处理器通常提供一些设置,以启动、禁用和调优处理器级别的特性。这些选项通常在启动时通过BIOS设置菜单管理。

内存:
系统主存存储应运程序和内核指令,包括它们的工作数据,以及文件系统缓存。许多系统中,存放这些数据的二级存储是主要的存储设备磁盘它们的处理速度 比内存低几个数量级。

需要考察的影响系统性能的因素包括分配和释放内存、复制内存、以及管理内存地址空间映射的CPU开销。对于多路处理器架构的系统,由于连接到本地CPU的内存相对于远程CPU访问时更低,内存本地性也是一个影响因素

主存:也称为物理内存,描述了计算的调整数据存储区域,通常是动态随机访问内存DRAM
虚拟内存:一个抽象的请在概念,它(几乎是)无限的和竞争性的。虚拟内存不是真实的内存。
常驻内存:当前处于主存中的内存。
匿名内存:无文件系统位置或者路径名的内存。它包括进程地址空间的工作数据,称作堆。
地址空间:内存上下文。每个进程和内核都有对应的虚拟地址空间。
段:标记为特殊用途的一块内存区域,例如用来存储可执行或者可写的页。
OOM:内存耗尽,内核检测 到的可用内存低。
页: 操作系统和CPU使用的内存单位。它一直以来是4KB或者8KB。现代的处理器允许多种页大小以支持更大的页面尺寸。
缺页:无效的内存访问。使用按需虚拟内存的时,这是正常事件。
换页:在请在与存储设置间交换页。

交换:源自UNIX,指将整个进程从主存转移到交换设备。它可以是存储设备的一块空间,也称为物理交换设备,或者是文件系统文件,称作交换文件。部分工具用交换这个术语指虚拟内存

进程的地址空间由虚拟内存子系统映射到主内存和物理交换设备。内核会按需在它们之间移动内存页,这个过程称作交换。

文件系统换页:
文件系统换页由读写位于内存中的映射文件页引发。对于使用文件内存映射mmap的应用程序和使用了页缓存的文件系统,这是正常的行为。这也被称作好的换页。
有需要时,内核可以调出一些页释放内存。这睦说法变得有点复杂:如果一个文件系统页在主契中修改过,页面换出要求将该页写回磁盘。相反,如果文件系统页没胡修改,因为磁盘已经存在一份副本,页面掏出仅仅释放这些内存以便立即重用。因术语页面换出指 个页被移出内存--这可能包括或者不包括写一个存储设置

匿名换页:
匿名换页牵涉进程的私有数据:进程堆和栈。被称为匿名是由于它在操作系统中缺乏有名字的地址(例如,没有文件系统路径)。匿名页面换出要求迁移数据到物理交换设备或者交换文件。
匿名换页拖累性能,因此被称为“坏的”换页。当应用程序访问被调出的页时,会被读页的磁盘IO阻塞。这就是匿名页面换入,它给应用程序带来同步延时。匿名页面换出可能不会直接影响 应用程序性能,因为它由内核异步执行。
性能在没有匿名换页的情况下处理最难状态。要做到这一点,可以通过配置应用程序常驻于内存并且监控页面扫描、内存使用率和匿名换页,来确保不存在内存短缺的迹象。

交换:
交换是在请在与物理交换设备或者交换文件之间移动整个进程。
交换出一个进程,要求进程的所有私有数据必须被定稿交换设备,包括线程结构和进程堆。源文件系统而且没有修改的数据可以被丢弃,需要的时候再从原来的位置读取。
因为进程和一小部分元数据总是常驻于内核内存中,内核仍能知道已交换出的进程。至于要将哪个进程交换回来,内核会考虑线程优先级、磁盘等待时间以及进程的大小。长期等待和较小的进程享有更高的优先级。

文件系统缓存占用
系统启动之后内存的占用增加是正常的,因为操作系统会将可有内存用于文件系统缓存以提高性能。该原则是:如果有可用的主内存,就有效地使用它。

使用率和饱和度
主内存的使用率可由已占用的内存除以总内存得出。文件系统缓存占用的内存可当作未使用,因为它可以被应用程序重用。
对内存的需要超过了请在的被称作主存饱和。这时操作系统会使用换页、交换或者在Linux中用OOM终结者来释放内存。以上任一操作都标志着请在饱和

分配器
当虚拟内存处理多任务物理内存时,在虚拟地址空间中实际分配和内存堆放通常由分配器来处理。用户态库或者内核程序向程序员提供简单的内存使用接口(例如malloc()、free())。
当分配器对性能有显著的影响,一个系统通常会提供多个可选择的用户态分配器库。分配器可以利用包括线程级别对象内的技术以提高性能,但是如果分配变碎并且损耗变高,它们也会损害性能。

字长
处理器可能会支持多种字长,例如32位和64位,这样两种应用程序可以运行。地址空间受限于字长的寻址空间,因此32位的地址空间放下来需要4GB以上的应用程序,必须用64位或者更大的字长来编译。

硬件
内存硬件包括主存、总线、CPU缓存和MMU内存管理单元

主存
目前常见的请在类型是动态随机存取内存DRAM。这是一钟易失性的内存–它存储的内容在断电时会丢失。由于每个比特仅由两个逻辑零件组成:一个电容和一个晶体管,DRAM能提供高容量的存储。其中电容需要定期更新以保持其电荷。

延时
主内存的访问时间可以用CAS列地址控制器计量:从发送需要读取的地址给一个内存模块,到数据可能被读取之间的时间。这个数值取决于内存的类型,对于内存IO传输,内存总线为了传输一个缓存行会发生多次此类延时。CPU和MMU读取新数据时也可能涉及其他延时。

主存架构
通过共享系统总线,每个CPU访问所有内存有均匀的访问存延时。如果上面运行的是单个操作系统实例并可以在所有处理器上运行时,又称为对称多处理器架构

总线
物理上主存如何连接系统取决于主存架构。实际的实现可能会涉及额外的CPU与内存之间的控制器和总线。可能访问方式如下。
共享系统总线:单个或多个处理器,通过一个共享的系统总线、一个内存桥控制器以及内存总线。
直连 互联
DDR SDRAM(双倍速率同步动态随机访问内存)
对于任何架构,内存总线速度常常取决于处理器和主板支持的内存接口标准。

多通道
系统架构可能支持并行使用多个内存总线来增加带宽。觉见的位数为双、三或者四通道 。

CPU缓存
处理器通常会在芯片中包含硬件缓存以提高内存访问性能。这些缓存可能包括如下级别,速度递减和大小递增。
L1:通常分为指令缓存和数据缓存。
L2:同时缓存指令和数据
L3:更大一级的缓存。

一级缓存通常按虚拟内存地址空间寻址,二级及以上按物理内存地址寻址,具体取决于处理器。

MMU内存管理单元负责虚拟到物理地址的转换。它按页做转换,而页内的偏移量则直接映秀。

多种页大小

现代处理器支持多种页大小,允许操作系统和MMU使用不同的页大小,如4KB、2KB、1GB。
linux支持超大页,为特别的大页尺寸,如2MB,留出部分物理内存。

TLB:
映射记录数量有限制,使用更大的页可以增加从其缓存转换的内存范围(它的触及范围),从页减少TLB未命中而提高系统性能。TLB能进一步按每个不同页大小分设单独的缓存,以提高在缓存中保留更大范围映射的可能性。

软件
内存管理软件包括虚拟内存系统、地址转换、交换、换页和分配。与性能密切相关的内容包括这些部分:内存释放、空闲链表、页扫描、交换、进程地址空间和内存分配器

内存释放
系统中的可用内存过低,内核有多种方法释放内存,并添加到页空闲链表中

空闲链表:一个未使用的页列表也称为空闲内存,它能立刻用于分配。通常的实现是多个空闲页链表,每个本地组NUMA一个
回收:内存低于某个阈值,内核模块和内核分配器会立刻释放任何可轻易释放的内存。
linux中页面缓存:文件系统缓存。一个称作交换倾向的可调参数能调节系统倾向性,决定是通过换页还是交换来释放内存。交换:页面掏出守护进程dswapd执行的换页。它找出最近不使用的页并加入到空闲链表,其中包括应用程序内存。页页掏出涉及写入文件系统或者一人交换设备,仅在配置了交换文件或设备时才可用。OOM终结者:内存耗尽终结者搜索并杀死可牺牲的进程以释放内存,采用select_baand_process()搜索而后用oom_kill_process()杀死进程。在系统日志/var/log/messages中以 “Out of memory:Kill process”表现。

空闲链表:最初的UNIX内存分配器使用内存映射和首次匹配扫描。BSD引入虚拟内存换页时,空闲链表和页面掏出守护进程也被同时引入。空闲链表能立刻定位可用内存。

释放的内存添加到表对以便将来分配。通过页面掏出守护里程释放的内存--它可能包含有坐标的文件系统页缓存--被加到表尾。如果在未被重用前有对任一页的请求,它能被取回并从空闲链表中移除。

使用单个空闲链表是一种简化,具体实现依内核的类型及版本而不同。

Linux   用伙伴分配器管理页。它以2的幂的方式向不同尺寸的内存分配器提供多个空闲链表。术语伙伴指找到相信的空闲内存页以被同时分配
伙伴空闲链表处于如下等级结构的底端,起始于每个内存节点pg_data_t
节点:内存库,支持NUMA   
区域:特定用途的内存区域(直接内存访问(DMA)、普通、高位内存)
迁移类型:不可移动,可回收,可移动……
尺寸:数量为2的幂次方的页面。

在节点的空链表内分配能提高内存的本地性和性能。

    页染色是虚拟和物理页地址的映射。它可能利用了散列、轮询调度,或者其他的方式。这是另一个提高访问性能的策略

回收:
回收大多是从内核的slab分配器缓存释放内存。这些缓存包含slab大小的未使用内存块,以供重用。回收这些内存交还经系统进行分配。

Linux中,内核模块也可以调用register_shrinker()以注册特定的函数回收自己的内存。

页扫描:
内核页面掏出守护进程管理利用掏出页释放内存。当主存中可用的空闲链表低于阈值时,页面换出守护进程会开始扫描。

页仅按需启动。通常平衡的系统不会经常做页扫描并且仅以短期爆发方式扫描。如前所述。基于Solaris的系统在页面扫描前会利用其他机制释放内存,因此若页扫描多于几秒通常是内存压力问题的预兆。

Linux:页面换出守护进程被称作kswaps(),它扫描非活动和活动内存的LRU(最近最少被使用)页列表以释放页面。它的激活基于空闲内存和两个提供滞后的阈值。


进程地址空间

进程地址空间是一段范围的虚拟页,由硬件和软件同时管理,按需映射到物理页。这些地址被划分为段以存放线程栈、进程可执行文件、库和堆。
应用程序可执行段包括分离的文本和数据段。库也由分离的可执行文本和数据段组成。这些不同的段类型如下。

可执行文本:包括可执行的进程CPU指令。由文件系统中的二进制应用程序文本段映射。它是只读的并带来执行权限。
可执行数据:包括已初始化的变量,由二进制应用程序的数据段映射而来。在读写权限,因此这些变量在应用程序的运行过程中可以被修改。它也带有私有标记,因此这些修改不会被写回磁盘。
堆:应用程序的临时工作内存并且是匿名内存(无文件系统位置)。它按需增长并且用mollac()分配。
栈:运行中的线程栈,映射为读写

库的文件段可能与其他使用相同库的进程共享,它们各自有一份库数据段的私有副本。

堆增长:

不停增长的堆通常会引起困惑。它是内存泄漏吗?对于大多数分配器,free()不会将内存还给操作系统,相反的,会保留它们以备将来分配。这意味着进程的常驻内存只会增长,并且是正常现象。进程缩减内存的方法如下。

Re-exec:从空的地址空间调用exec()
内存映射:使用mmap()和munmap(),它们会归还内存到系统。

一些分配器支持mmap运行模式、

分配器:
多种用户和内核级的分配器可用于内存分配。
内存分配器的特征如下。
简单API:如malloc()、fee()。
高效的内存使用:处理多种不同大小的内存分配时,当存在许多浪费内存的未使用区域时,内存使用可能会变得碎片化。分配器会尽可能合并未使用的区域,因此大块的分配可使它们提高效率。
性能:内存分配会很频繁,而且在多线程的环境里它们可能会因为竞争同步基元而表现糟糕。分配器可设计为慎用锁,并利用线程级或者CPU级的缓存以提高内存本地性。
可观测性:分配器可能会提供统计数据和排错模式以显示如何被调用,以及调用分配的代码路径。

以下部分描述内核级分配器--slab分配器和SLUB--以及用户级分配器--libmalloc、libumem和mtmalloc

slab:
内核slab分配器管理特定大小的对象缓存,使它们能被快速地回收自用,并且避免页分配开销。这对于经常处理固定大小结构的内核内存分配来说特别有效。

libumem
是一个用户空间版的slab分配器。可能通过链接或预加载库为多线程应用程序提高性能。

libumem 自设计之初就考虑到可扩展性,以及排错分析能力,并尽可能减少时间和空间的开销。其他的内存分析工具在处于分析模式时会减速分析目标--有时严重到问题不再重现,并且经常使目标不适合生产环境使用。

工具方法

工具法遍历可用的工具,检查它们提供的关键指标。尽管是一个简单的方法,但它有可能忽视这些工具不可见或者看不清楚的问题,并且操作比较费时。

页扫描:寻找连续的页扫描(超过10秒),它是内存压力的预兆。Linux中,可以使用sar -B并检查pgscan列。在Solaris中,可以使用vmstat(1M)并检查sr列。

换页:换页是系统内存低的进一步征兆。Linux中,可以用vmstat(8)并检查si和so列(这里,交换指匿名换页)。Solaris中,vmstat -p 按类型显示换页,检查匿名换页。

vmstat:每秒运行vmstat检查free列的可用内存。

OOM终结者:仅对Linux有效,这些事件可以在系统日志/var/log/message,或者从dmesg(1)中找到。搜索“Out of memory”。

交换:仅对Solaris有效,运行vmstat并检查W列,它显示交换出的线程,这往往事后才能注意到。

top/prstat:查看哪些进程和用户是(常驻)物理内存和虚拟内存的最大使用者(列名参考man)。这些工具也会总结内存使用率。

dtrace/stap/perf:内存分配的栈跟踪,确认内存使用的原因。

使用特征归纳
实施容量规则、基准和负载模拟时,归纳内存使用特征分析是一项重要的活动。发现错误的配置,可能促成最大的性能提升。

由于更多内存被用于缓存工作数据, 这些特征会因时间而变化。内核或者应用程序内存也可能随时间持续增长--除正常的缓存增长外--还有由软件错误导致的内存泄漏。

这个方法以及要衡量的特征(谁、为什么、什么、如何)

监测随时间失衡的内存使用率,特别是按进程监测,有助于发现是否存在内存泄漏及其泄漏速度。

泄漏检测

当应用程序或者内核模块无尽增长,从空闲链表、文件系统缓存,最终从其他进程消耗内存时,这就出现了这个问题。初决注意到这个问题可能是因为系统为应对无尽的压力而做换页。

内存泄漏:一种类型的软件bug。忘记分配过的内存没有释放。通过修改软件代码,或者应用补丁及进行升级能修复。
内存增长:软件在正常地消耗内存,远高于系统允许的速率。通过修改软件配置,或者由软件开发人员修改软件内存的消耗方式来修复。

分析

介绍基于linux操作系统的内存分析工具。如何使用见前述的策略。

vmstat 虚拟和物理存储器统计信息
sar 历史统计信息
slabtop 内核块分配统计信息
ps  进程状态
top 监视每进程存储器使用率
pmap 进程地址空间统计信息
Dtrace 分配跟踪

Linux vmstat

该版本的vmstat不在第一行输出自系统启动至今的memory列的汇总数据,而立刻显示当前状态。
swpd:交换出的内存量。
free:空闲的可用内存。
buff:用于缓冲缓存的内存。
cache:用于页缓存的内存。
si:换入的内存
so:掏出的内存。

如果si和so列一直非0,那么系统正存在内存压力并换页到交换设备或文件(见swap8)。用其他工具可以研究什么在消耗内存,例如能观察每进程内存使用的工具。

拥有大量内存的系统中,数据列会不对齐而影响阅读。你可以试着用-S选项进行修改输出单位为MB,选项-a可以输出非活动和活动页缓存的明细:

Linux sar统计信息

-B  pgpgin/s    页面换
-B  pgpgout/s   页面换出
-B  fault/s 严重及轻微牛缺页
-B  majflt/s 严重缺页
-B  pgfree/s 页页加入空闲链表
-B  pgscank/s 被后台页面掏出守护进程扫描过的页面(kswapd)
-B  pgscand/s 直接页面扫描
-B  pgsteal/s 页面及交换调整缓存回收
-B  %vmeff 页面盗取、页面扫描比率,显示页面回收的效率
-H hbhugfree 空闲巨型页面存储器
-H hbhugused 占用的巨型页面存储器
-r  kbmemfree 空闲存储器
-r  kbmemused 占用存储器(不包括内核)
-r  kbbuffers 缓冲高速缓存尺寸
-r  kbcached 页面高速缓存尺寸
-r  kbcommit 提交的主存储器:服务当前工作负载需要量的估计
-r  %commit 为当前工作负载提交的主存储器,估计值
-r  kbactive 活动列表存储器尺寸
-r  kbinact 非活动列表存储器尺寸
-R  frpg/s 释放的存储器页面,负值表明分配
-R  bufpg/s 缓冲高速缓存增加值(增长)
-R  campg/s 页面高速缓存增加值(增长)
-S  kbswpfree 释放交换空间
-S  kbswpused 占用交换空间
-S  kbswpused 调整缓存的交换空间:它同时保存在主存储器和交换设备中,因此不需要磁盘IO就能被页面掏出
-S  kbswpcan 页面换入
-W  pswping/s 页面换出
-W  pswpout/s   



更重要的是要记住这些关于使用率和高级内存子系统运行的具体信息,在需要的时候都能找到的。要更加深入地了解,可能需要阅读源代码中mm部分,准确的说是mm/vmscan.c。开发人员常常讨论应该如何统计这些信息,在linux-mm邮件列表中有许多文章提供了更深刻的理解。

%vmeff是衡量页回收效率的一个有趣指标。高数值意思着成功地从非活动列表中回收了页(健康),低数值意味着系统在挣扎中。Man手册指出100%是高数值,小于30%是低数值。

slabtop
Linux的slabtop命令可以通过slab分配器输出内核slab缓存的使用情况。类似top,它实时更新屏幕

输出包括顶部的汇总信息和slab列表,其中包括对象数量OBJS、多少是活动的ACTIVE、使用百分比USE、对象大小OBJ SIZE字节和缓存大小CACE SIZE字节。
这个示例中,用选项-sc按缓存大小排序,最大值在顶端。
slab统计信息取自/proc/slabinfo,也可以用vmstat -m输出

top
命令监控排名靠前的运行中进程并且显示内存使用统计信息。
顶部的概要显示了主存Mem及虚拟内存Swap的总量、使用量和空闲量。缓冲缓存buffers和页缓存cache大小也同时显示。
prstat
能输出微状态统计信息,如文字和数据缺页计数。

prstat -mLcp 4937

pmap
命令列出进程的内存映射,显示它们的大小、权限及映射的对象。这使进程内存使用能被仔细地检查以及量化共享内存。

Dtrace
用户级的分配器跟踪用pid provider。这是一个动态跟踪provider,它意味着任何时刻都可以控制软件,不需要重启也不需要在此之前配置分配器运行于排错模式。

内核级的分配器自用fbt动态provider,也能用类似的方式跟踪。

缺页跟踪
能更深入地提示系统如何分配内存。可以利用fbt动态provider,或者在可用的情况下使用稳定的vminfo provider

严重缺页可以通过vminof::maj_fault探针跟踪

页面换出守护进程
如果需要,页面换出守护进程的内部运行也能用fbt provider跟踪。具体情况基于内核版本而不同。

其他Linux内存性能工具如下。
free: 报告空间内存,包括缓存区高速缓存和页缓存
dmesg: 检查来自OOM终结者Out of memory信息
valgrind: 一个包括memcheck在内的性能分析套件,它是一个内存使用分析的封闭程序,可用于发现泄漏。它能造成严重的系统开销,它的文档手册指出可引起目标系统慢20到30倍
swapon: 添加和观察物理交换设备或者文件。
iostat: 如果交换设备是物理磁盘或块,设备IO可能用iostat来观测,它指出系统是否在换页
perf: 利用它能观察CPI、MMU、TSB事件,以及源自CPU性能计数器的内存总线的停滞周期计数。它还提供缺页以及一些内核内存Kmem事件的探针。
/proc/zoneinfo: 内存区域NUMA节点的统计信息
/proc/buddyinfo: 内核页面伙伴分配器统计信息

内存调优
最重要的内存高估是保证应用程序保留在主存中,并且避免换页和交换经常发生。

内核可调参数、配置大页面、分配器和资源控制

Linux内存可调参数示例

vm.dirty_background_bytes       0       触发pdflush后台回写的脏存在器量
vm.dirty_backgroud_ratio            10      触发pdflush后台回写的脏系统存储器百分
vm.dirty_bytes                      0       触发一个定稿进程开始回写的脏存储器量
vm.dirty_ratio                      20      触发一个定稿进程开始回写的脏系统存储器比例
vm.dirty_expire_centisecs           3000    适用pdflush的脏存储器最小时间
vm.dirty_writeback_centisecs        500 pdflush活跃时间间隔
vm.min_free_kbytes              dynamic 设置期望的空闲存储器量
vm.overcommit_memory            0   
vm.swappiness                       60          相对于页面调整缓存回收更倾向用交换
vm.vfs_cache_pressure               100         回收高速缓存的目录和inode对象的程序。

多个页面大小
更大的页面能通过提高TLB缓存命中率来提升内存io性能。现代处理器支持多个页面大小,例如默认的4KB以及2MB的大页面。

在Linux中,有许多设置大页面的方法

分配器
有多种为多线程应用程序 提升性能的用户级分配器可供选用。可以在编译阶段选择,也呆以在执行时用LD_PRELOAD环境变更设置。

资源控制
基础的资源控制,包括设置主存限制和虚拟内存限制,可以用ulimit实现

文件系统
一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问。别处,还包括一些表示设备、套接字和的特殊文件类型,以及包含文件访问时间戳的元数据。

操作:文件系统的操作是对文件系统的请求,包括read()、write()、open()、close()、stat()、mkdir()以及其他操作

IO输入输出:不包括open()和Close()

逻辑IO:由应用程序发给文件系统的IO

物理IO:由文件系统直接发给磁盘的IO

吞吐量:当前应用程序和文件系统之间的数据传输率,单位是B/s

inode:一个索引节点是一种含有文件系统对象元数据的数据结构,其中有访问权限、时间戳以及数据指针。

VFS:虚拟文件系统,一个为了抽象与支持不同文件系统类型的内核接口。

卷管理器:灵活管理物理存储设备的软件,在设备上创建虚拟卷供操作系统作用。

文件系统逻辑操作:
read()、write()、open()、close()、seek()、sync()、link()、unlink()、mkdir()、ioctl()

系统工具管理操作:
mount()、umount()、sync()

研究文件系统性能的方法里,有一咱方法是把它当成一个黑盒子,只关注对象操作的时间延时

文件系统缓存
读操作从缓存返回(缓存命中)或者从磁盘返回(缓存未命中)。未命中的操作被存储在缓存中,并填充缓存热身。

文件系统延时
指的是一个文件系统逻辑请求从开始到结束的时间。它包括了消耗在文件系统、内核磁盘IO子系统以及等待磁盘设备–物理IO的时间。应用程序的线程通常在请求时阻塞,等待文件系统请求的结束。
一般的做法是使用内核跟踪工具打印出用户层发起文件系统逻辑IO的调用栈,通过研究调用栈可以看出,应用程序里哪个函数产生了IO

缓存
对应用程序这是透明的:它们的逻辑IO延时小了很多,因为可能直接从请在返回而不 是从慢得多的磁盘设备返回。

原则:如果还有空闲内存,不用来存放有用的内容。当应用程序需要更多的内存时,内核应该迅速从文件系统缓存中释放一些以备使用。
文件每户用缓存caching提高读性能,用缓冲buffering在缓存中提高写性能。文件系统和块设备子系统一般使用多种类型的缓存。

页缓存         操作系统页缓存
文件系统主存      ZFS ARC
文件系统二级缓存        ZFS L2ARC
目录缓存            目录缓存,DNLC
inode缓存     inode缓存
设备缓存            ZFS vdev
块设备缓存       块缓存buffer cache

随机与顺序IO
顺序IO里每个IO都开始于上一个IO结束的地址。
随机IO则找不出iO之间的关系,段义和量随机变化。

由于存储设备的某此特征的缘故,文件系统一直以来在磁盘上顺序和连续地存放文件数据,以努力减少随机IO的数目。当文件系统未能达成这个目标时,文件的摆放变得杂乱无章,顺序的逻辑IO被分解成随机的物理IO,这种我们称为碎片化。

预取
通过检查当前和上一个IO的文件偏移量,可以检测出当前是否是顺序读负载,并且做出预测,在应用程序请求前向磁盘发出读命令,以填充文件系统缓存。这样如果应用程序真的发同了读请求,就会命中缓存

而一量预测不准,文件系统会发起应用程序不需要的IO,不仅污染了缓存,也消耗了磁盘和IO传输的资源。

写回缓存
当数据定稿主存后,就认为写入已经结束并返回,之后再异步地把数据刷入磁盘。文件系统定入脏数据的过程称为刷新

这期间牺牲了可靠性。基于DRAM的请在是不可靠的,脏数据会在断电的情况下丢失,而应用程序却认为写入已经完成。并且数据可能被非完整写入,这样磁盘上的数据就是在一种破坏的状态。

文件系统默认采用写缓存策略,但同时也提供一个同步写的选项绕过这个机制,把数据直接写在磁盘上。

同步写
所有的数据以及必要的文件系统元数据被完整地定写入到永久存储介质如磁盘设备中。由于包含了磁盘IO的延时,所以

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章