12月10日 Linux系统调优

1、cpu亲缘性绑定

就是将进程绑定在固定的cpu上,提高cpu缓存命中率。

[root@node1 vusers.d]#ps axo psr,comm,pid #可以查看进程运行在哪颗cpu上
[root@node1 vusers.d]#taskset -p -c 0 2857 #将进程编号为2857的进程绑定到0号cpu上
pid 2857's current affinity list: 0-3
pid 2857's new affinity list: 0
[root@node1 vusers.d]#ps axo psr,comm,pid |grep 2857 #发现此进程只绑定在0号cpu上了
  0 sshd              2857

2、修改进程的nice优先级

[root@node1 vusers.d]#ps axo pid,cmd,nice #查看进程的nice优先级
[root@node1 vusers.d]#renice -n -10 10972 #修改进程的优先级
10972 (process ID) old priority 0, new priority -10
[root@node1 vusers.d]#ps axo pid,cmd,nice |grep 10972
 10972 /usr/sbin/vsftpd /etc/vsftp -10
nice -n -10 vim f1 指定优先级打开某个程序

3、隔离cpu和中断

cpu不仅要运行进程还要处理中断,如果一个进程运行的cpu处理中断的次数过多,势必会影响进程的运行,为了不影响进程,可以将cpu进行隔离,比如有4核cpu,可以隔离出2核cpu,并和进程进行绑定用于专门运行进程,剩下的两核处理中断,这样运行进程的cpu就不会处理中断,提高进程的运行效率
①如何进行cpu隔离

centos6中:vim /etc/grub.conf
在kerner最后加上isolcpus=cpu编号0,1,2,3等,隔离哪颗cpu,就写上哪颗cpu的编号
centos7中:vim /etc/grub2.cfg
在linux16 /vmlinuz-3.10.0-514.el7.x86_64最后加上isolcpus=cpu编号0,1,2,3等

②如何隔离中断

[root@node1 vusers.d]#cat /proc/interrupts  #可以查看每个cpu处理中断的次数,比如0号中断,0号cpu处理了20次
            CPU0       CPU1       CPU2       CPU3       
   0:         20          0          0          0   IO-APIC-edge      timer
   1:         12          0          0          0   IO-APIC-edge      i8042
   8:          1          0          0          0   IO-APIC-edge      rtc0
   9:          0          0          0          0   IO-APIC-fasteoi   acpi
  12:         16          0          0          0   IO-APIC-edge      i8042
  14:          0          0          0          0   IO-APIC-edge      ata_piix
  15:        150          0          0      39853   IO-APIC-edge      ata_piix
  16:        305          0          0          0   IO-APIC-fasteoi   vmwgfx, snd_ens1371
  17:       9412          0       6435          0   IO-APIC-fasteoi   ehci_hcd:usb1, ioc0
  18:        204          0          0          0   IO-APIC-fasteoi   uhci_hcd:usb2
  19:         65          0          0    1083401   IO-APIC-fasteoi   ens33, ens37
如何将所有的中断都绑定到0,1号cpu上,这里的cpu编号应该是isolcpus中定义的cpu集合之外的其他cpu,也就是被隔离的cpu运行进程,其他的cpu用于处理中断
[root@node1 0]#cd /proc/irq/1/
[root@node1 1]#ls
affinity_hint  i8042  node  smp_affinity  smp_affinity_list  spurious
[root@node1 1]#cat smp_affinity
00000000,00000000,00000000,00000004
[root@node1 1]#echo 1 >smp_affinity 
[root@node1 1]#cat smp_affinity
00000000,00000000,00000000,00000001

此项一般也不进行设定,知道就可以。

4、内存优化

  • 内存的过量使用
    echo 1 > /proc/sys/vm/overcommit_memory #用于设定是否可以过量使用内存
    0:是默认值,内核执行启发式内存过量使用处理,方法是估算可用内存量,并且拒绝明显无效的请求,遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造成系统中的可用内存超载,相当于自动模式
    1:内核执行无内存过量使用处理,也就是不能使用swap交换内存,比如实际使用的物理内存是64G,那么允许使用的内存就不能超过64G,如果用着用着内存超过了64G,又不允许使用交互内存,就会造成内存被耗尽。
    2:表示运行内存过量使用,也就是可以使用swap交换内存,但要配合overcommit_ratio使用,可用的物理内存=swap+ramovercommit_ratio,overcommit_ratio是一个比例,比如swap=4G,
    ram=2G,overcommit_ratio=0.5,可用的物理内存=4+2
    0.5=5G,但如果ram值很大,比如服务器的ram=64G,此时overcommit_ratio就要设置的大一点,比如0.9或者0.95,这样可用的内存=4+64*0.9=61.6G
    这样ram的物理内存就不会被耗尽,因为使用了57.6之后就会使用交换内存,当然我们有的时候为了调优的目的,会把这个值设置为1,这样就会最大限度的利用ram物理内存,直到内存被耗尽为止
  • 设置超大内存页数
[root@node1 vm]#cat /proc/sys/vm/nr_hugepages #规定在内核中配置的超大页数,默认值为0,只有系统中有足够的连续可用页时放可分配
0
如果要启动直接echo一个正整数即可
以上操作要想永久保存可以写到配置文件/etc/sysctl.conf
[root@node1 vm]#sysctl --help
使用sysctl -p可以让配置文件生效
[root@node1 vm]#cat /proc/meminfo  #可以查看是否配置超大内存页
HugePages_Total:       0 
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
[root@node1 vm]#echo 10 > /proc/sys/vm/nr_hugepages
[root@node1 vm]#cat /proc/meminfo 
HugePages_Total:      10 #发现设置了10个超大内存页
HugePages_Free:       10
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB #每个内存页的大小为2048KB
  • 与容量相关的内容可调参数
    在/proc/sys/kernel目录中
    用于设置进程间通讯时占用内存的大小,进程间相互通讯时靠消息队列中的消息进行通讯,如果a进程要和b进程通讯,就发一个消息,然后将这个消息放到消息队列中排队,轮到这个消息了就发给b进程,两个进程通讯时在内存中有很多个消息队列。发送的消息时会放在随机的一个消息队列中
    msgmax:单个消息的最大值,默认值为65536个字节
    msgmnb:单个消息队列的最大值,默认值也是65536个字节,如果单个消息的大小占65536个字节,那么这个消息队列中只能放一个消息了
    msgmni:规定消息队列的最大数量,64位架构机器默认值为1985,32位架构机器默认值为1736
    msgmnbmsgmni就是内存中的消息队列所占的内存空间有多大
    shmall:规定共享内存片段一片最大能有多大,共享内存由一个个共享内存片段组成,此值规定的就是每个共享内存片段的大小,64位架构机器的默认值为4294967296个字节;32位架构的机器默认值为268435456字节
    shmmax:以字节为单位规定内核可允许的最大共享内存,64位系统默认为68719476736,32位系统默认为4294967295,注:内核支持的值比这个值要多的多
    shmmni:规定系统最大共享内存片段有多少个,64和32位系统默认都是4096个
    shmmax=shmall
    shmmni
    threads-max:规定一次内核使用的最大线程数,发起进程请求时需要创建线程,这个值就是规定能够创建多少个线程,最小值为20
  • 与容量相关的文件系统可调参数
    位于/proc/sys/fs目录中
    aio-max-nr:规定异步I/0模式允许的最多事件数,默认值为65536,一般用于nginx等支持异步I/O模式的服务,这个值已经够大了,一般不需要调整
    file-max:内核分配的文件数的最大值,默认为1024个,一般不需要修改
    上面两个参数,每调大一个就意味着物理内存空间会被占用一些,这就需要有足够大的物理内存空间
  • Out-of-Memory Kill可调参数
    在/proc/pid/oom_adj目录下 pid代表进程编号
    定义-16到15之间的一个数值以便帮助决定某个进程的oom_score,oom_score的值越高,当内存被耗尽时就优先被oom_killer杀死,将oom_adj的值设置为-17则表示这个进行刀枪不入,不能被oom_killer杀死,为了避免内存耗尽时某个进程被杀死,可以将此值设置为-17,但要先利用脚本获取某个进程的进程编号才能修改
  • 调整虚拟内存
    swappiness:参数值为0-100,调整系统使用交换内存倾向性的设置,数值越高,越优先使用交换内存,默认为60,如果要想让系统尽量不使用交换内存,可以将overcommit_memory设置为1,也就是不允许过量使用内存,不能使用swap交换内存,然后将swappiness设置为0,默认值为60比较大,为了调优,要把此值设置的小一点,要让系统尽量不使用交换内存,以提升性能。
[root@centos6 1345]#cat /proc/sys/vm/swappiness
60

min_free_kbytes:设置系统剩余可用物理内存为多少时才开始使用交换内存,单位为KB,一般不需要调整

[root@centos6 1345]#cat /proc/sys/vm/swappiness
60

dirty_ratio:规定百分比值,当脏数据的大小达到系统内存总大小的这个百分比值后开始把脏数据同步到磁盘,我们在更改一个文本时,先把这个文本读到内存中,在内存中更改,脏数据指的是在内存中修改完还没有来得急同步到磁盘上的数据,当脏数据的大小达到规定的百分比时开始往磁盘上写脏数据,默认为20,这个值不应该设置的过大,如果服务器挂了,就会有很多在内存中的数据还没有同步到磁盘上,造成数据丢失,如果值过小又会造成频繁的写操作,增加磁盘IO,影响系统性能

[root@centos6 1345]#cat /proc/sys/vm/dirty_ratio #默认值较小,可以改为40
20

dirty_background_ratio:也是规定百分比,根上面不同的是,dirty_ratio是单个进程脏数据大小占总内存大小的百分比达到多少时开始写脏数据到磁盘,而dirty_background_ratio是所有进程的脏数据大小占总内存大小的百分比达到多少时开始写脏数据到磁盘,默认为10
drop_caches:表示释放内存的缓存,值有以下三个
1:系统释放所有页缓冲内存,页缓存是缓存文件的数据
2:系统释放所有未使用的slab缓冲内存,slab是缓存文件的元数据
3:系统释放所有页缓冲和slab缓冲内存

[root@centos6 1345]#free -m
             total       used       free     shared    buffers     cached
Mem:           980        910         69          2         65        494
-/+ buffers/cache:        350        630
Swap:         2047          0       2047
[root@centos6 1345]#echo 1 > /proc/sys/vm/drop_caches 
[root@centos6 1345]#free -m #发现缓存已经变成53了
             total       used       free     shared    buffers     cached
Mem:           980        396        583          2          0         53
-/+ buffers/cache:        343        637
Swap:         2047          0       2047

不建议在生成环境中使用drop_caches释放缓存

5、磁盘I/O性能优化

磁盘器中的调度算法
CFQ:完全公平队列,尽可能保证将可用I/O能力公平的分配给需要用到IO请求的进程
Deadline:每一个IO请求都有一个最后期限,在这个最后期限内IO请求必须被完成,使每个IO请求都不能被饿死
Anticipatory:就是在每一次IO操作时磁头会在那个磁道和扇区停留一会,看有没有其他IO请求也要写到这个区域的,就正好顺道写上,但实际上这种调度算法并不会提高多少IO性能,这种算法在较新的版本中在内核中已经被移除了
Noop:不做调度,先进行的请求先进行写磁盘操作
每个磁盘都有一个调度器

[root@node1 devices]#find /sys/devices/ -iname scheduler
/sys/devices/pci0000:00/0000:00:07.1/ata2/host2/target2:0:0/2:0:0:0/block/sr0/queue/scheduler 
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:0/0:0:0:0/block/sda/queue/scheduler
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:1/0:0:1:0/block/sdb/queue/scheduler
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:2/0:0:2:0/block/sdc/queue/scheduler
/sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:3/0:0:3:0/block/sdd/queue/scheduler #在这些目录下的scheduler文件中定义了当前正在使用的磁盘调度器
[root@centos6 1345]#cat /sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda/queue/scheduler #centos6中默认是cfq调度算法
noop anticipatory deadline [cfq] 
[root@node1 devices]#cat /sys/devices/pci0000:00/0000:00:10.0/host0/target0:0:1/0:0:1:0/block/sdb/queue/scheduler #centos7中默认是deadline调度算法
noop [deadline] cfq 
[root@centos6 1345]#echo deadline > /sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda/queue/scheduler #修改磁盘调度器的调度算法
[root@centos6 1345]#cat /sys/devices/pci0000:00/0000:00:10.0/host2/target2:0:0/2:0:0:0/block/sda/queue/scheduler
noop anticipatory [deadline] cfq 

一般情况下不需要修改调度算法,因为即使修改了也提高不了多少IO性能,还不如使用固态硬盘提高的性能大。

6、文件系统

1、在执行mkfs创建文件系统时指明块大小,根据存储文件的的大小进行设定,如果存储的都是小文件,就使用小块,如果存储的文件比较大就使用大块
2、外部日志:将日志放在专用的外部存储中,但要确保外部日志是可靠的,不然丢失外部日志文件都可能造成文件系统的四级,外部日志在运行mkfs创建文件系统,并要挂载时指定日志设备
3、挂载选项:
Barriers:Barriers可以保证数据的可靠性,启用Barriers会显著延缓一些程序的写入性能,可使用nobarrier挂载选项禁用barrier,但禁用后可能会造成一些数据丢失,对于可以容忍断电后承受数据丢失的场景可以使用此挂载选项
noatime:挂载时使用noatime挂载选项,如果不需要准确的atime,还可以启用nodiratime,表示不更新目录的访问时间戳,但对文件是无效的,noatime对文件和目录都有效,设定了noatime就不用设定nodiratime了
ext4文件系统
init_itable=n挂载选项可以控制发生初始化的比例,其中执行这个后台初始化的时间约为1/n,n的默认值为10
anto-fsync行为,ext4默认自动同步文件,可以使用mount -o noauto_da_alloc选项禁用它,这意味着该程序必须明确使用fsync()以保证数据一致
XFS文件系统
一般不需要调整,基本上都是最优的

6、网络优化

计算核心缓冲的大小total buffers=带宽*网络延迟

[root@node1 devices]#ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=1.97 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=1.02 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=1.07 ms
64 bytes from 172.18.0.1: icmp_seq=4 ttl=64 time=1.36 ms
^C
--- 172.18.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.020/1.360/1.979/0.382 ms #avg就是平均的网络延迟
对于千兆以太网
带宽=1000Mb/S
1000*1024*1024b/s
total buffers=1000*1024*1024b/s*1.36*10^-3s=1.42Mb=186122字节
根据这个值设置以下各项
vim /etc/sysctl.conf
net.core.rmem_default #核心接收缓冲的默认值
net.core.rmem_max #核心接收缓冲的最大值
net.core.wmem_default #核心发送缓冲的默认值
net.core.wmem_max #核心发送缓冲的最大值
sysctl -p
[root@node1 devices]#sysctl -a |grep net.core #可以查看默认值
net.core.rmem_default = 212992 #单位是字节,可以修改为上面的186122
net.core.rmem_max = 212992
net.core.wmem_default = 212992
net.core.wmem_max = 212992
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_mem #tcp协议的内存空间大小
21813   29084   43626 #有三个值,min default max
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_rmem #tcp协议的接收缓冲大小
4096      87380 6291456
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_wmem #tcp协议的发送缓冲大小
4096      16384 4194304
内存在接收数据时先放到内存的接收缓冲区,再放到内存,发送数据时先放到内存的发送缓冲区,再发送出去
在使用nginx等web服务时经常需要调整的内核参数
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_tw_reuse #允许重用TCP的TIME-WAIT状态重用
0
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_syncookies #启用
syncookies可以在一定程度上保护syn flood攻击,也就是有大量客户端syn请求被涌入时
1
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_max_orphans #在内核中允许的最大孤儿进程,孤儿进程指的是内核打开了tcp套接字
,但没有任务一个文件描述符关联到此套接字上,这种就称为孤儿进
程,这个值一般只能调大,比如在受到ddos攻击时会打开大量的套接
字,但来不及创建文件
4096
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
[root@node1 devices]#cat /proc/sys/net/ipv4/tcp_max_tw_buckets #内核所能允许的tcp的time-wait状态套接字的数量
4096
[root@node1 devices]#cat /proc/sys/net/core/somaxconn 
128
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容