0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux之性能优化

马哥Linux运维 来源:马哥Linux运维 2024-12-06 10:15 次阅读

一、优化内核相关参数

配置文件/etc/sysctl.conf
配置方法直接将参数添加进文件每条一行

sysctl -a 可以查看默认配置
sysctl -p 执行并检测是否有错误

1、网络相关

net.core.somaxconn=65535
一个端口最大监听TCP连接队列的长度

net.core.netdev_max_backlog=65535
数据包速率比内核处理快时,送到队列的数据包上限

net.ipv4.tcp_max_syn_backlog=65535
TCP syn 队列的最大长度, 第一次握手的连接参数过大可能也会遭受syn flood攻击

net.ipv4.tcp_fin_timeout=10
fin超时时间,表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间

net.ipv4.tcp_tw_reuse=1
是否允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0 关闭

net.ipv4.tcp_tw_recycle=1
是否开启TCP连接中TIME-WAIT sockets的快速回收,默认为0 关闭

关于网络参数调优模板,主机配置为8G和16G内存【按需调整】

参数 默认配置 调整配置 说明
fs.file-max 1048576 9999999 所有进程打开的文件描述符数
fs.nr_open 1635590 1635590 单个进程可分配的最大文件数
net.core.rmem_default 124928 262144 默认的TCP读取缓冲区
net.core.wmem_default 124928 262144 默认的TCP发送缓冲区
net.core.rmem_max 124928 8388608 默认的TCP最大读取缓冲区
net.core.wmem_max 124928 8388608 默认的TCP最大发送缓冲区
net.ipv4.tcp_wmem 4096 16384 4194304 4096 16384 8388608 TCP发送缓冲区
net.ipv4.tcp_rmem 4096 87380 4194304 4096 87380 8388608 TCP读取缓冲区
net.ipv4.tcp_mem 384657 512877 769314 384657 512877 3057792 TCP内存大小
net.core.netdev_max_backlog 1000 5000 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.optmem_max 20480 81920 每个套接字所允许的最大缓冲区的大小
net.core.somaxconn 128 2048 每一个端口最大的监听队列的长度,这是个全局的参数
net.ipv4.tcp_fin_timeout 60 30 对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡
net.core.netdev_max_backlog 1000 10000 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.ipv4.tcp_max_syn_backlog 1024 2048 对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字
net.ipv4.tcp_max_tw_buckets 5000 5000 系统在同时所处理的最大timewait sockets数目
net.ipv4.tcp_tw_reuse 0 1 是否允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_keepalive_time 7200 900 表示TCP链接在多少秒之后没有数据报文传输时启动探测报文(发送空的报文)
net.ipv4.tcp_keepalive_intvl 75 30 表示前一个探测报文和后一个探测报文之间的时间间隔
net.ipv4.tcp_keepalive_probes 9 3 表示探测的次数

注意:
参数值并不是设置的越大越好,有的需要考虑服务器的硬件配置,参数对服务器上其它服务的影响等。

2、本地端口号

有时候我们修改了文件句柄限制数后,错误日志又会提示 "Can’t assignrequested address"。
这是因为TCP 建立连接,在创建 Socket 句柄时,需要占用一个本地端口号(与 TCP 协议端口号不一样),相当于一个进程,便于与其它进程进行交互。
Linux内核的TCP/IP 协议实现模块对本地端口号的范围进行了限制。当端口号用尽,就会出现这种错误了。

我们可以修改本地端口号的范围。

#查看IP协议本地端口号限制
cat /proc/sys/net/ipv4/ip_local_port_range

#一般系统默认为以下值
32768    61000

#修改本地端口号
vim /etc/sysctl.conf

#修改参数
net.ipv4.ip_local_port_range = 1024 65000

#保存修改后,需要执行sysctl命令让修改生效
sysctl -p

注意:
1、net.ipv4.ip_local_port_range的最小值为1024,1024以下的端口已经规划为TCP协议占用,如果想将 TCP 协议端口设置为8080等大端口号,可以将这里的最小值调大。
2、如果存在应用服务端口号大于1024的,应该将 net.ipv4.ip_local_port_range 的起始值修改为大于应用服务端口号,否则服务会报错。

kernel.shmmax=4294967295
该参数定义了共享内存段的最大尺寸(以字节为单位)。

其值应>=sag_max_size初始化参数的大小,否则SAG由多个内存段构成,效率降低,
还要不小于物理内存的一半,默认情况下在32位x86系统中,Oracle SGA最大不能超过1.7GB.

kernel.shmmni=4096
这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096.

kernel.shmall = 2097152
该参数表示系统任意时刻可以分配的所有共享内存段的总和的最大值(以页为单位).

其值应不小于shmmax/page_size.缺省值就是2097152,如果服务器上运行的所有实例的
SGA总和不超过8GB(通常系统可分配的共享内存的和最大值为8GB),通常不需要修改.

vm.swappiness=0

内存分配策略,设置为0是告诉系统除非虚拟内存完全满了 否则不要使用交换区

风险:

降低操作系统性能
在系统资源不足下,容易被OOM kill掉

二、提高资源限制上限

配置文件位于 /etc/security/limit.conf

* soft nofile 65535
* hard nofile 65535

" * "对所有用户有效

soft 当前系统生效的设置

hard 系统所能设定的最大值

nofile 打开文件的最大数目

65535 限制的数量

需要重启系统生效

案例

一次nginx在早高峰时段大量用户同时请求验证出现连接缓慢问题,问题是由于资源限制问题导致

日志信息

2024/04/25 0823 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0824 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0824 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0825 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0825 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0826 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0826 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0827 [crit] 37451#0: accept4() failed (24: Too many open files)
2024/04/25 0827 [crit] 37451#0: accept4() failed (24: Too many open files)

报错原因
通过ulimit -a命令查询,发现主机最初设置系统文件最大打开数(open files )过于保守,致使早高峰时段大量用户同时请求验证出现连接缓慢问题。

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 127886
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 127886
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

进一步查看nginx进程的limit限制,发现nginx主进程软限制是1024,硬限制是4096。

c4d2b36c-afde-11ef-93f3-92fbcf53809c.png

解决方式
修改配置文件/etc/security/limits.conf,增加配置以下配置并重启Nginx主进程:

root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

Nginx配置文件增加配置:

worker_rlimit_nofile 65535;

验证
nginx进程最大文件打开数已设置成功

c4e3c008-afde-11ef-93f3-92fbcf53809c.png

三、磁盘调度策略

参数路径:/sys/block/devname/queue/scheduler

简介:

noop电梯式调度策略
实现了一个FIFO队列 倾向饿死读而利于写 对闪存设备 RAM嵌入式系统是最好的选择

deadline 截止时间调度策略
确保了在一个截止时间内服务请求 这个截止时间是可调整的 而默认读期限短于写期限
对于数据库类应用是最好的选择

anticipatory 预料IO调度策略
本质上和deadline一样 但在最后一次读操作后 要等待6ms 才能继续进行对其他IO请求进行调度 将一些小写入流合并成一个大写入流 用写入延迟换取最大的写入吞吐量 适合写入较多的环境 比如文件服务器 对数据库环境表现很差

cfq 绝对公平算法

内核参数存储路径

文件/目录 作用
/proc/sys/abi/* 用于提供对外部二进制的支持,比如在类UNIX系统,SCO UnixWare 7、SCO OpenServer和SUN Solaris 2上编译的软件。默认情况下是安装的,也可以在安装过程中移除。
/proc/sys/fs/* 设置系统允许的打开文件数和配额等。
/proc/sys/kernel/* 可以启用热插拔、操作共享内存、设置最大的PID文件数和syslog中的debug级别。
/proc/sys/net/* 优化网络,IPV4和IPV6
/proc/sys/vm/* 管理缓存和缓冲

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11285

    浏览量

    209267
  • 主机
    +关注

    关注

    0

    文章

    992

    浏览量

    35111

原文标题:Linux之性能优化

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux性能优化大全!

    高并发和响应快对应着性能优化的两个核心指标:吞吐和延时
    发表于 11-21 11:23 674次阅读

    HBase性能优化方法总结

    HBase是Hadoop生态系统中的一个组件,是一个分布式、面向列的开源数据库,可以支持数百万列、超过10亿行的数据存储,因此,对HBase性能提出了一定的要求,那么如何进行HBase性能优化
    发表于 04-20 17:16

    Linux系统的性能优化策略

    近年来,世界上许多大软件公司纷纷推出各种Linux服务器系统及Linux下的应用软件。目前,Linux 已可以与各种传统的商业操作系统分庭抗礼,在服务器市场,占据了相当大的份额。本文分别从磁盘调优,文件系统,内存管理以及编译
    发表于 07-16 06:23

    Linux和Android系统故障和优化性能的方法和流程探讨

    作为一名Linux 或 Android 平台的系统工程师,在开发系统新功能外,主要工作就是优化系统性能,使系统上以最优的状态运行,但是由于硬件问题、软件问题、网络环境等的复杂性和多变性,导致对系统
    发表于 07-22 06:48

    css的性能优化重点

    网站前端性能优化javascript和css
    发表于 10-21 09:12

    MySQL优化查询性能优化查询优化器的局限性与提示

    MySQL优化三:查询性能优化查询优化器的局限性与提示
    发表于 06-02 06:34

    谈一谈Linux基础Makfile文件

    Linux基础Makfile文件Linux基础Makfile文件编译流程Makefile的介绍Makefile简单的练习Makefile的组成Makefile的组成Makefile
    发表于 12-15 08:58

    基于Linux的Socket网络编程的性能优化

    基于Linux的Socket网络编程的性能优化 随着Intenet的日益发展和普及,网络在嵌入式系统中应用非常广泛,越来越多的嵌入式设备采用Linux操作系统。
    发表于 10-22 20:48 1084次阅读
    基于<b class='flag-5'>Linux</b>的Socket网络编程的<b class='flag-5'>性能</b><b class='flag-5'>优化</b>

    Linuxchardev_buttom_linux_struc

    Linuxchardev_buttom_linux_struct_poll教程,很好的Linux资料,快来学习吧
    发表于 04-15 17:49 7次下载

    Linuxtasklet教程

    Linuxtasklet教程,很好的Linux自学资料,快来学习吧。
    发表于 04-15 17:59 5次下载

    Linuxchardev_buttom_linux_struc

    Linuxchardev_buttom_linux_struct_timer_debounce教程,很好的Linux自学资料,快来学习吧。
    发表于 04-15 17:59 5次下载

    Linux CPU的性能应该如何优化

    Linux系统中,由于成本的限制,往往会存在资源上的不足,例如 CPU、内存、网络、IO 性能。本文,就对 Linux 进程和 CPU 的原理进行分析,总结出 CPU 性能
    的头像 发表于 01-18 08:52 3371次阅读

    影响Linux性能的因素与优化方法

    ,那么linux作为一个开源平台,最终要实现的是通过这些开源软件的支持,以最低廉的成本,达到应用最优的性能。因此,谈到性能问题,主要实现的是linux操作系统和应用程序的最佳结合。
    的头像 发表于 04-12 09:18 816次阅读

    Linux内核slab性能优化的核心思想

    今天分享一篇内存性能优化的文章,文章用了大量精美的图深入浅出地分析了Linux内核slab性能优化的核心思想,slab是
    的头像 发表于 11-13 11:45 617次阅读
    <b class='flag-5'>Linux</b>内核slab<b class='flag-5'>性能</b><b class='flag-5'>优化</b>的核心思想

    如何优化Linux服务器的性能

    优化Linux服务器的性能是一个综合性的任务,涉及硬件、软件、配置、监控等多个方面。以下是一个详细的指南,旨在帮助系统管理员和运维人员提升Linux服务器的
    的头像 发表于 09-29 16:50 291次阅读