ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Linux培训-优化篇

Linux培训-优化篇

原创 Linux操作系统 作者:wwjfeng 时间:2018-08-03 22:12:36 0 删除 编辑

一.硬件优化

系统运行的速度是由系统中最慢的设备来决定。

选择固态硬盘:

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 2
procs -----------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多M
cache 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

# iostat
Linux 3.10.0-693.el7.x86_64 (rh1)       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.46
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.87        12.23         5.24     898971     385228
scd0              0.00         0.01         0.00       1054          0
dm-0              0.86        11.76         5.21     864302     383008
dm-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 -x
Linux 3.10.0-693.el7.x86_64 (rh1)       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.46
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               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.03
scd0              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.00
dm-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.03
dm-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 ALL
Linux 3.10.0-693.el7.x86_64 (rh1)       08/02/2018      _x86_64_        (1 CPU)
10:13:33 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:13:33 PM  all    0.20    0.01    0.32    0.01    0.00    0.01    0.00    0.00    0.00   99.46
10: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@rh1 ~]# cat /sys/block/sda/queue/scheduler

noop [deadline] cfq 

[root@rh1 ~]# echo cfq>/sys/block/sda/queue/scheduler

[root@rh1 ~]# cat /sys/block/sda/queue/scheduler

noop deadline [cfq] 


(2).修改所有的配置

修改 grub.conf 
#boot=/dev/hda
default=0 
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title 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 389952
net.ipv4.tcp_wmem = 4096  16384 4194304
net.ipv4.tcp_rmem = 4096  87380 4194304
net.ipv4.udp_mem = 194976 259968 389952
net.core.wmem_max = 131071 
net.core.rmem_max = 131071 
net.core.wmem_default = 110592 
net.core.rmem_default = 110592


 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15412087/viewspace-2169025/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 分析函数改写SQL
请登录后发表评论 登录
全部评论

注册时间:2010-03-27

  • 博文量
    138
  • 访问量
    57773