美文网首页
12月10日 Linux系统调优

12月10日 Linux系统调优

作者: 张大志的博客 | 来源:发表于2017-12-11 20:10 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:12月10日 Linux系统调优

          本文链接:https://www.haomeiwen.com/subject/mhrwixtx.html