Linux培训-优化篇
一.硬件优化
系统运行的速度是由系统中最慢的设备来决定。
选择固态硬盘:
TLC SLC(最好)MLC
优化的时候,优化离cpu最近的设备
CPU --> CACHE
主频:倍频 * FSB
CACHE:高速缓冲器,提高应用程序的命中率.L1(数据区,指令区)独立->L2 独立->L3 共享
优化思路:想方设法让应用数据停留在cache中更长的时间。
应用运行过程:
DISK-->MEM --> cache --> CPU
DISK:优化IO算法
SSD: SATA3-->PCIe --> NVMe
二.系统层面
1.常用命令
(1).ps
自定义显示进程列
# ps axo pid,comm,pcpu
(2).vmstat
# vmstat 1 2procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 148 284184 212 663928 0 0 12 5 81 121 0 0 99 0 0 0 0 148 284060 212 663928 0 0 0 0 96 126 0 0 100 0 0 r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多Mcache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。in 每秒CPU的中断次数,包括时间中断cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。wt 等待IO CPU时间。
(3).iostat
# iostatLinux 3.10.0-693.el7.x86_64 (rh2) 08/02/2018 _x86_64_ (1 CPU)avg-cpu: %user %nice %system %iowait %steal %idle 0.20 0.01 0.32 0.01 0.00 99.46Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 0.87 12.23 5.24 898971 385228scd0 0.00 0.01 0.00 1054 0dm-0 0.86 11.76 5.21 864302 383008dm-1 0.00 0.03 0.00 2228 152
avg-cpu:
选项 | 说明 |
---|---|
%user | CPU在用户态执行进程的时间百分比。 |
%nice | CPU在用户态模式下,用于nice操作,所占用CPU总时间的百分比 |
%system | CPU处在内核态执行进程的时间百分比 |
%iowait | CPU用于等待I/O操作占用CPU总时间的百分比 |
%steal | 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比 |
%idle | CPU空闲时间百分比 |
Device:
选项 | 说明 |
---|---|
Device | 设备名称 |
tps | 每秒向磁盘设备请求数据的次数,包括读、写请求,为rtps与wtps的和。出于效率考虑,每一次IO下发后并不是立即处理请求,而是将请求合并(merge),这里tps指请求合并后的请求计数。 |
Blk_read/s | Indicate the amount of data read from the device expressed in a number of blocks per second. Blocks are equivalent to sectors with kernels 2.4 and later and therefore have a size of 512 bytes. With older kernels, a block is of indeterminate size. |
Blk_wrtn/s | Indicate the amount of data written to the device expressed in a number of blocks per second. |
Blk_read | 取样时间间隔内读扇区总数量 |
Blk_wrtn | 取样时间间隔内写扇区总数量 |
# iostat -xLinux 3.10.0-693.el7.x86_64 (rh2) 08/02/2018 _x86_64_ (1 CPU)avg-cpu: %user %nice %system %iowait %steal %idle 0.20 0.01 0.32 0.01 0.00 99.46Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda 0.00 0.02 0.24 0.63 12.23 5.24 40.10 0.00 0.88 1.18 0.77 0.31 0.03scd0 0.00 0.00 0.00 0.00 0.01 0.00 68.00 0.00 0.35 0.35 0.00 0.35 0.00dm-0 0.00 0.00 0.21 0.64 11.75 5.21 39.57 0.00 0.94 1.33 0.80 0.31 0.03dm-1 0.00 0.00 0.00 0.00 0.03 0.00 36.06 0.00 7.01 0.05 24.21 1.21 0.00
选项 | 说明 |
---|---|
rrqm/s | 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并 |
wrqm/s | 每秒对该设备的写请求被合并次数 |
r/s | 每秒完成的读次数 |
w/s | 每秒完成的写次数 |
rkB/s | 每秒读数据量(kB为单位) |
wkB/s | 每秒写数据量(kB为单位) |
avgrq-sz | 平均每次IO操作的数据量(扇区数为单位) |
avgqu-sz | 平均等待处理的IO请求队列长度 |
await | 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位) |
svctm | 平均每次IO请求的处理时间(毫秒为单位) |
%util | 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率 |
(4).mpstat
查看多核cpu ,可以显示每个核心cpu的运行情况。 vmstat 只能显示总体的cpu
# mpstat -P ALLLinux 3.10.0-693.el7.x86_64 (rh2) 08/02/2018 _x86_64_ (1 CPU)10:13:33 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle10:13:33 PM all 0.20 0.01 0.32 0.01 0.00 0.01 0.00 0.00 0.00 99.4610:13:33 PM 0 0.20 0.01 0.32 0.01 0.00 0.01 0.00 0.00 0.00 99.46
(5).
# time ls
real 0m0.006s
user 0m0.000s
sys 0m0.005s
* 0.001s 为等待时间
(6).sar
sar 日志存储目录
cd /var/log/sa
# sar -f sa31 #默认cpu# sar -f sa31 -b #查看磁盘# sar -q -f sa31 #查看队列# sar -q -f sa31 |awk '{print $3}' |sort -unr #最大队列的进程号# sar -d -p -f sa31 |awk '{print $2,$4}' |grep ^sd |sort -unr #哪个设备的读取速率最高# sar -n DEV #查看网络吞吐量# sar -r 1 1 #内存和swap使用情况
(7).dmidecode
查看详细的硬件信息
(8).lspci,lscpu,lsusb,lsscsi,lsblk
查看各种硬件信息命令
(9).dmesg
- 记录系统启动时候的硬件相关信息,启动后该日志文件不再更新
/var/log/dmesg
- 查看系统启动后加载的硬件信息,需要查看dmesg
2.sysctl
(1).sysctl -a #显示当前可调整的所有参数
(2).修改配置文件,调整参数
vim /etc/sysctl.conf老版本
vim /etc/sysctl.d/10-sysctl.conf 新版本
(3).sysctl -p /etc/sysctl.d/10-sysctl.conf
使参数永久生效
3.swap
swap可以是文件也可以是磁盘分区,最多可以有32个,每个最大64G
性能考虑:
避免 swap 文件
将 swap 分区分速度快的介质上
多个小的 swap 效果要比一个大的 swap 效果好 设置 swap 优先级别
4.内核IO调度器
-NooP Scheduler
适用于随机访问设备,如闪盘 FIFO ,基本合并与排序 适用于嵌入式操作系统
-Anticipatory I/O Scheduler
内核默认的调度器
不适用于数据吞吐量大的数据库系统
-DeadLine Io调度器
提升 IO 性能的同时避免 IO等待
保证既定的IO请求最小的延迟时间
-CFQ I/O Schedulere
RHEL 默认的调度器 IO请求轮询进行,为应用平均分配带宽,提供一个平等的工作环境
(1).临时修改
[root@rh2 ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
[root@rh2 ~]# echo cfq>/sys/block/sda/queue/scheduler
[root@rh2 ~]# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
(2).修改所有的配置
修改 grub.conf #boot=/dev/hdadefault=0 timeout=5splashimage=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle Red Hat Enterprise Linux Server (2.6.18-8.el5)root (hd0,0)kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/ rhgb quiet elevator=deadline initrd /initrd-2.6.18-8.el5.img
(3).tuned-adm
5.内存优化
相关参数:
vm.dirty_expire_centisecs = 3000 #旧数据的回写时间,30秒后脏页要回写到磁盘vm.dirty_background_ratio = 10 #整个系统脏页百分比超过10,则进行刷脏页vm.dirty_ratio = 30 #整个脏页达到内存的30%时,则进行刷脏页vm.dirty_writeback_centisecs = 500 #刷新脏数据进程的时间间隔vm.swappiness=30 #使用内存还是swap的倾向值
6.网络优化
BDP 带宽延迟乘积
计算公式(字节) = 带宽(MB)x 延时 (s)x1024x1024/8
相关参数:
net.ipv4.tcp_mem = 194976 259968 389952net.ipv4.tcp_wmem = 4096 16384 4194304net.ipv4.tcp_rmem = 4096 87380 4194304net.ipv4.udp_mem = 194976 259968 389952net.core.wmem_max = 131071 net.core.rmem_max = 131071 net.core.wmem_default = 110592 net.core.rmem_default = 110592
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341