浅谈Linux系统参数调优

一、ulimit优化

ulimit约束了系统最大打开的文件数量,可以通过以下方式来修改:

  • 通过ulimit -n命令来修改,如ulimit -n 65535
  • 通过修改/etc/security/limits.conf,将注释内容去掉

    内容如下:

  1. * soft nofile 65535
  2. * hard nofile 65535
  3. root soft nofile 65535
  4. root hard nofile 65535

注:

  • *表示对所有用户有效
  • root 表示对root用户有效
  • soft 表示当前系统生效值
  • hard 表示系统最大打开的值
  • nofile 表示最大打开的文件数量
  • 65535 数量值

注:soft不能比hard大

二、内核参数优化

1、参数详解
名称 默认值 建议值 描述
net.ipv4.tcp_syn_retries 5 1 对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃
net.ipv4.tcp_synack_retries 5 1 决定内核在放弃连接之前所送出的 SYN+ACK 数目
net.ipv4.tcp_keepalive_time 7200 600 TCP发送keepalive探测消息的间隔时间
net.ipv4.tcp_keepalive_probes 9 3 TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效
net.ipv4.tcp_keepalive_intvl 75 15 探测消息未获得响应时,重发该消息的间隔时间(秒)
net.ipv4.tcp_retries2 15 5 在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试
net.ipv4.tcp_fin_timeout 60 2 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间
net.ipv4.tcp_max_tw_buckets 180000 36000 系统在同时所处理的最大 timewait sockets 数目
net.ipv4.tcp_tw_recycle 0 1 打开快速 TIME-WAIT sockets 回收
net.ipv4.tcp_tw_reuse 0 1 表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接
net.ipv4.tcp_max_orphans 8192 32768 系统所能处理不属于任何进程的TCP sockets最大数量
net.ipv4.tcp_syncookies 0 1 打开syncookies,目的是为了防止syn flood攻击
net.ipv4.tcp_max_syn_backlog 1024 16384 对于那些依然还未获得客户端确认的连接请求﹐需要保存在队列中最大数目
net.ipv4.tcp_wmem 4096 16384 131072 8192 131072 16777216 为TCP socket预留用于发送缓冲的内存数量(三个分别为最小值,默认值和最大值)
net.ipv4.tcp_rmem 4096 87380 174760 3276 131072 16777216 与 tcp_wmem 类似,不过它表示的是为为TCP socket自动调优所使用的接收缓冲区的值(三个分别为最小值,默认值和最大值)
net.ipv4.tcp_mem 根据内存计算 786432 1048576 1572864 确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(三个分别为最小值,默认值和最大值)
net.ipv4.ip_local_port_range 32768 61000 1024 65000 表示用于向外连接的端口范围
net. netfilter.nf_conntrack_max 65535 65535 系统支持的最大ipv4连接数
net. netfilter.nf_conntrack_tcp_timeout_established 432000 180 已建立的tcp连接的超时时间
net.core. netdev_max_backlog 1024 16384 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.somaxconn 128 16384 用来限制监听(LISTEN)队列最大数据包的数量
kernel.shmmax 根据内存情况 根据内存计算 共享内存段的最大值(建议是物理内存的一半至物理内存-1个比特的大小这个范围内)
vm.swappiness 60 0 交换分区的控制(控制为0表示虚拟内存占满的情况下才使用交换分区)
2、参数修改

修改方式:

  • echo 配置值 > /proc/sys/对应的文件即可,将表格中的.换成/即可,如echo 128 > /proc/sys/net/core/somaxconn(这可以临时生效,重启系统会恢复默认)
    • 修改/etc/sysctl.conf,将下面的完整配置内容放入,并使用sysctl -p使配置永久生效
      完整配置:
  1. net.ipv4.tcp_syn_retries = 1
  2. net.ipv4.tcp_synack_retries = 1
  3. net.ipv4.tcp_keepalive_time = 600
  4. net.ipv4.tcp_keepalive_probes = 3
  5. net.ipv4.tcp_keepalive_intvl =15
  6. net.ipv4.tcp_retries2 = 5
  7. net.ipv4.tcp_fin_timeout = 2
  8. net.ipv4.tcp_max_tw_buckets = 36000
  9. net.ipv4.tcp_tw_recycle = 1
  10. net.ipv4.tcp_tw_reuse = 1
  11. net.ipv4.tcp_max_orphans = 32768
  12. net.ipv4.tcp_syncookies = 1
  13. net.ipv4.tcp_max_syn_backlog = 16384
  14. net.ipv4.tcp_wmem = 8192 131072 16777216
  15. net.ipv4.tcp_rmem = 32768 131072 16777216
  16. net.ipv4.tcp_mem = 786432 1048576 1572864
  17. net.ipv4.ip_local_port_range = 1024 65000
  18. net.netfilter.nf_conntrack_max = 65536
  19. net.netfilter.ip_conntrack_tcp_timeout_established=180
  20. net.core.somaxconn = 16384
  21. net.core.netdev_max_backlog = 16384
  22. kernel.shmmax=18446744073692774399 #根据系统的内存情况决定
  23. vm.swappiness=0

三、文件系统优化

1、文件系统类型的选择
  • EXT4(对于是EXT32/3的文件系统更容易升级)
  • XFS(性能和可扩展性更好)
2、硬盘调度算法的选择
  • CFQ:按照IO请求的地址进行排序,而不是按照先来后到的顺序来进行响应(系统默认)(桌面系统)
  • NOOP:该算法实现了最最简单的FIFO队列,所有IO请求大致按照先来后到的顺序进行操作(适用闪存设备、RAM设备,嵌入式系统)
  • DEADLINE:DEADLINE在CFQ的基础上,解决了IO请求饿死的极端情况。除了CFQ本身具有的IO排序队列之外,DEADLINE额外分别为读IO和写IO提供了FIFO队列(适合于数据库类应用,建议使用)
  • ANTICIPATORY(系统未必支持):在DEADLINE的基础上,为每个读IO都设置了6ms的等待时间窗口。如果在这6ms内OS收到了相邻位置的读IO请求,就可以立即满足(写入较多的环境,如文件服务器)

查看系统支持的调度算法:

  1. dmesg | grep -i scheduler

查看当前系统的硬盘调试策略:

  1. cat /sys/block/sda/queue/scheduler

结果如下:

  1. noop deadline [cfq]

表示当前支持noop,deadline,cfq三种调度算法,当前调度算法为cfq

修改调度策略:

  1. echo <schedulername> > /sys/block/<devname>/queue/scheduler
  • <schedulername> 表示调试策略名
  • <devname>表示磁盘名称,如sda
    如:
  1. echo deadline>/sys/block/sda/queue/scheduler
3、文件写入策略与关闭文件访问时间修改
  • data = writeback | ordered | journal
    • writeback:原数据与事务日志不是同时写入(最快)
    • ordered:只记录原数据,同时写日志(安全性好)
    • journal:原子日志
  • noatime,nodiratime

修改/etc/fstab

如原文件:

  1. /dev/mapper/vg_localserver222-lv_root / ext4 defaults 1 1
  2. UUID=7ca0a025-cac9-4445-a227-09ccd0e2b2d9 /boot ext4 defaults 1 2
  3. /dev/mapper/vg_localserver222-lv_swap swap swap defaults 0 0
  4. tmpfs /dev/shm tmpfs defaults 0 0
  5. devpts /dev/pts devpts gid=5,mode=620 0 0
  6. sysfs /sys sysfs defaults 0 0
  7. proc /proc proc defaults 0 0

在相应的挂载目录添加noatime即可,如在挂载目录为/处添加:

  1. /dev/mapper/vg_localserver222-lv_root / ext4 defaults,noatime,nodiratime,data=writeback 1 1
  2. UUID=7ca0a025-cac9-4445-a227-09ccd0e2b2d9 /boot ext4 defaults 1 2
  3. /dev/mapper/vg_localserver222-lv_swap swap swap defaults 0 0
  4. tmpfs /dev/shm tmpfs defaults 0 0
  5. devpts /dev/pts devpts gid=5,mode=620 0 0
  6. sysfs /sys sysfs defaults 0 0
  7. proc /proc proc defaults 0 0

注:需要重启系统才能生效