Linux Performance Tunnel

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]

调优思路:

性能指标:定位瓶颈

调优

时间: 2024-12-18 06:41:43

Linux Performance Tunnel的相关文章

linux Performance tools

废话不说首先看图,这是摘自以为大神的ppt,原文在这里 http://www.brendangregg.com/Slides/SCaLE_Linux_Performance2013.pdf 准备把上面列举出来的图片挨个写blog 分享一下,哦也 linux Performance tools,码迷,mamicode.com

Linux Performance Analysis and Tools(Linux性能分析和工具)

首先来看一张图: 上面这张神一样的图出自国外一个Lead Performance Engineer(Brendan Gregg)的一次分享,几乎涵盖了一个系统的方方面面,任何人,如果没有完善的计算系统知识,网络知识和操作系统的知识,这张图中列出的工具,是不可能全部掌握的. 出于本人对linux系统的极大兴趣,以及对底层知识的强烈渴望,并作为检验自己基础知识的一个指标,我决定将这里的所有工具学习一遍(时间不限),这篇文章将作为我学习这些工具的学习笔记.尽量组织得方便自己日后查阅,并希望对别人也有一

[转帖]How use Nmon and &quot;Java Nmon Analyzer&quot; for Monitor Linux Performance

How use Nmon and "Java Nmon Analyzer" for Monitor Linux Performance https://linoxide.com/monitoring-2/install-nmon-monitor-linux-performance/ Updated May 9, 2018By Pungki AriantoMONITORING, OPEN SOURCE TOOLS Nmon is a  resource monitoring tools

Linux Performance Monitoring Commands

Reference [1] http://www.thegeekstuff.com/2011/07/iostat-vmstat-mpstat-examples/?utm_source=feedburner [2] https://www.computerhope.com/unix/iostat.htm [3] https://www.lifewire.com/linux-system-running-uptime-3867758 uptime and w report how long the

Linux GRE tunnel的构建原理

Generic Enapsulation Tunnel是一种网络隧道技术,之所以称为通用隧道技术,是它可以用来将Ethernet.IP.MPLS等多种报文封装在IP报文中予以转发,在网络中存在较为大规模的应用. Linux系统原生支持了GRE接口,其配置命令如下: ip tunnel add gret1 mode gre remote 45.42.104.183 local 189.245.246.51 ttl 128  # 配置一条以189.245.246.51为源地址,45.42.104.1

Linux SSH tunnel access test

Use the SSH to build up the tunnel access to other computer can make the communication encrypted and secured, tested on the http service by using the SSH tunnel access, 1, use the wireshark to capture the data without the SSH tunnel,  host as 192.168

linux 性能调优工具参考 (linux performance tools)

之前发现几张图对于linux使用者有着较强的参考意义,下面对其进行简单备忘: # linux 静态信息查看工具 # linux 性能测试工具 benchmark # linux 性能观测工具 # linux 性能调优工具  资源来源链接:http://www.brendangregg.com/linuxperf.html 保持更新,其中不少工具都有使用过,欢迎大家留言交流:更多内容请关注 cnblogs.com/xuyaowen; 原文地址:https://www.cnblogs.com/xuy

Network subsystem Of Linux Performance and Tuning Guidelines

Linux Performance tool

https://www.tecmint.com/command-line-tools-to-monitor-linux-performance/ https://www.tecmint.com/linux-performance-monitoring-with-vmstat-and-iostat-commands/ https://www.tecmint.com/linux-performance-monitoring-tools/ https://geekflare.com/linux-per