Linux优化
一、影响Linux性能的各种因素以及性能优化工具
一)系统硬件资源
1、CPU
- 充分利用多核技术(计算性软件(业务))
消化CPU的业务:动态web服务、mail服务
2、内存
- 物理内存与swap的取舍
- 选择64位的Linux操作系统
消化内存的业务:使用内存数据库(redis、hbase、mongodb)
3、磁盘
- RAID技术(RAID0/1/5/01/10)
- SSD磁盘(对磁盘性能要求高的业务)
- Ceph技术
消耗磁盘性能的业务:数据库服务器
4、网络带宽
- 网卡、交换机选择
千兆网卡,需要选择万兆交换机(核心)
- 操作系统双网卡绑定
消耗带宽的业务:Hadoop平台、视频业务平台
5、系统硬件性能分析标准
影响性能因素 |
评判标准 | |||
好 | 坏 | 糟糕 | 备注 | |
CPU | %user + %sys < 70% | %user + %sys = 85% | %user + %sys >= 90% | |
内存 |
Swap In (si) = 0 Swap Out (so) = 0 |
Per CPU with 10 page / s |
More Swap In & Swap Out | |
磁盘 | % iowait < 20% | % iowait = 35% | % iowait>= 50% |
其中:
%user:表示CPU处在用户模式下的时间百分比。
%sys:表示CPU处在系统模式下的时间百分比。
%iowait:表示CPU等待输出完成的时间百分比。
sawp in 即si:表示虚拟内存页导入,即从SWAP DISK交换到RAM。
二)操作系统相关
1、系统安装优化
磁盘分区、RAID设置、swap设置
2、内核参数优化
常用的
- ulimit -n 最大打开文件数
- ulimit -u 最大用户数
- ulimit -u 可以设置max user processes limits,但是往往在设置的过程中,这样直接修改,不仅只能临时生效,重启之后又无效了,而且老是会失败。而一般来说,修改ulimit的数值,只需要修改/etc/security/limits.conf即可,但是max user processes这个数值和其他的配置不同,需要修改另一个配置文件:/etc/security/limits.d/90-nproc.conf
3、文件系统优化
- ext2:Linux下标准文件系统,无日志记录(inode功能)
- ext3:在ext2基础上增加了日志记录功能(inode),仅支持32000个字,兖
- ext4:ext3的后续版本,Linux2.6.28内核开始支持。无限子目录支持,快速fsck
- xfs:高性能文件系统,Linux3.10内核开始默认支持
建议
- 读操作频繁,同时小文件众多的应用:首选ext4文件系统,接下来依次是xfs、ext3
- 写操作频繁的应用:首选是xfs,接下来依次是ext4和ext3
- 对性能要求不高、数据安全要求不高的业务,ext3是比较好的选择
三)程序问题
需要开发人员和运维人员一起解决
开发人员查看代码,介入处理,但作为运维人员需要给出程序问题的有力证据
四)Linux性能优化工具
1、cpu性能评估工具
vmstat(系统默认自带) 利用vmstat命令可以对操作系统的内存信息、进程状态、CPU活动等进行监视 常用方式:vmstat 2 3 表示每3秒更新一次输出信息,统计3次后停止输出 iostat -c 3 5 uptime 是监控系统性能最常用的一个命令,主要用来统计系统当前的运行状况,输出的信息依次为: 系统现在的时间、系统上次开机到现在运行了多长时间、系统目前有多少登录用户、系统在一分钟内、五分钟内、十五分钟内的平均负载
2、内存性能评估
加载文件到内存,然后从内存的buffer中完成数据的存取,而cache完成和CPU的值及热点数据的交互。
一个buffer文件:从硬盘到buffer,从buffer到磁盘
I/O请求:
磁盘性能指标:
IOPS(每秒的输入输出)读写次数:单位时间内,系统能处理I/O请求的数量
吞吐量:单位时间内能够完成数据传输的数量
磁盘性能压测:最大IOPS,最大吞吐量(上存储之前,首先要做压测):sysbench对磁盘进行压测
300 20M/s
调优:就是解决某一瓶颈(以最低成本,解决这一瓶颈,达到我们的需求)
free命令 经验公式:应用程序可用内存/系统物理内存>70%时,表示系统内存资源充足,不影响性能;应用程序可用内存/系统物理内存<20%时,表示系统内存资源紧缺,需要增加系统内存 20%<应用程序可用内存/系统物理内存<70%时,表示系统内存资源基本满足应用需求,暂时不影响系统性能 sar/pidstat 这两个命令主要用于监控全部或指定进程占用系统资源的情况,如 CPU、内存、设备IO sar安装 yum install sysstat 三个公用参数: -u 获取CPU状态 -r 获取内存状态 -d 获取磁盘 常用组合 sar -u 3 获取cpu3秒内的状态 pidstat -r -p 进程号 3 :获取单个进程内存3秒内状态
3、磁盘性能评估
iostat -d 3 5 第一条记录值比较大,原因是从系统启动开始到运行命令为止的值 sar -d 3 5 # iostat -d 3 5 Linux 3.10.0-514.el7.x86_64 (v05-dev-env10.010020009246.ytd-host.etongdai.org) 10/18/2018 _x86_64_ (2 CPU) Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.29 0.05 1.66 677984 22683736 sdb 0.24 0.04 6.30 493393 85898376 dm-0 0.31 0.03 1.62 446954 22170083
4、网络性能评估
ping 网络连通性,以及网络延时性 netstat -i 查看网络接口状态 -r 查看路由状态(route -n) mtr url地址:动态路由跟踪
traceroute url地址:静态路由跟踪
二、Linux系统优化
一)Linux系统优化项概述
- 系统最小化安装
- 网络配置
- SELinux、iptables策略配置
- ssh登录系统策略
- 调整文件描述符数量,进程及文件的打开都会小号文件描述符数量
- 打开系统最大连接数上限
- 定期更新系统时间(使其和互联网(内网)时间同步)
- 配置yum更新源,从国内(企业内网)更新源下载安装软件包
- 定时自动清理邮件临时目录垃圾文件,防止磁盘的inode数被小文件占满
- 精简并保留必要的开机自启动服务(如crond sshd network rsyslog sysstat)
- Linux内核参数优化/etc/sysctl.conf 执行sysctl -p生效
- 更爱系统字符集为zh_CN.UTF-8,使其支持中文,防止出现乱码
- 命令权限最小化:关闭危险命令
- 锁定关键系统文件,如:/etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab 处理以上内容后把chattr lsattr改名(即转移走)
- 清空/etc/issue /etc/issue.net 取出系统及内核版本登录显示
- 清除多余的系统虚拟用户帐号
- sudo审计
- 为grub引导菜单加密
- 禁止主机被ping
- 打补丁并升级有已知漏洞的软件
二)Linux系统优化项详述
1、Linux系统最小化安装
精简安装策略
- 仅安装需要,按需安装,不用不装
- 开发包、基本网络包、基本应用包
2、网络配置
- 服务器IP地址配置
- 网关、主机名配置
- dns配置
- HOSTS文件配置
3、SELinux、iptables策略配置
1、SELinux配置
cat /etc/selinux/config SELINUX的状态 enforcing 开启状态 permissive 提醒的状态 disabled 关闭状态 命令行操作 setenforce 0 关闭 getenforce 查看当时的状态
非交互修改 sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config
2、防火墙配置(关闭,并设置开机关闭)
CentOS6 iptables
/etc/init.d/iptables stop
chkconfig iptables off
CentOS7 firewalld(系统服务管理目录为/lib/systemd/system)
systemctl stop firewalld.service
systemctl disable firewalld.service
4、ssh登录系统策略
参考连接:https://www.cnblogs.com/xiaogan/p/5902846.html
1、备份原有配置文件
cp -rp /etc/ssh/sshd_config{,.bak}
2、修改默认配置/etc/ssh/sshd_config
#修改SSH默认端口:将默认的22端口修改为1万以上的端口号,避免被扫描和攻击 Port 51555 #不使用DNS反查,可提高ssh连接速度 UseDNS no #关闭GSSAPI验证,可提高ssh连接速度 GSSAPIAuthentication no #禁止root账号登录 PermitRootLogin no #修改监听协议,只监听某个或某些网络协议 #AddressFamily any AddressFamily inet #修改ssh只监听内网IP地址(IPV4和IPV6) #ListenAddress 0.0.0.0 #监听IPV4所有网络地址 ListenAddress 192.168.171.0 #禁止空密码登录 #PermitEmptyPasswords no #关闭基于密码认证的远程登录 PasswordAuthentication no #关闭质疑-应答模式 #ChallengeResponseAuthentication yes ChallengeResponseAuthentication no #开启GSSAPI用户认证 默认值为"no"。仅用于SSH-2。 #GSSAPIAuthentication no GSSAPIAuthentication yes #是否在用户退出登录后自动销毁用户凭证缓存。默认值是"yes"。仅用于SSH-2。 GSSAPICleanupCredentials yes #是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"。 #该指令中可以使用下列根据连接时的实际情况进行展开的符号:%% 表示'%'、%h 表示用户的主目录、%u 表示该用户的用户名。 AuthorizedKeysFile .ssh/authorized_keys Protocol 2 #使用ssh第2版本安全协议 HostKey /etc/ssh/ssh_host_rsa_key #一台主机可以拥有多个不同的私钥。 #"rsa1"仅用于SSH-1,"dsa"和"rsa"仅用于SSH-2。
5、定期更新系统时间(使其和互联网(内网)时间同步)
方法一:直接使用echo 追加到定时任务文件
echo "#time sync by wzs at 20160819" >/var/spool/cron/root echo "*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1" >>/var/spool/cron/root tail -2 /var/spool/cron/root
方法二:切换到用户的家目录,使用crontab –e设置定时任务
cd /root crontab -e #time sync by wzs at 20160819’ >>/var/spool/cron/root */5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1
6、配置yum更新源,从国内(企业内网)更新源下载安装软件包
CentOS6
cp -rp /etc/yum.repos.d/CentOS-Base.repo{,.bak}
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
CentOS7
cp -rp /etc/yum.repos.d/CentOS-Base.repo{,.bak}
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
7、精简并保留必要的开机自启动服务(如crond sshd network rsyslog sysstat)
CentOS5、6
方法一:先用egrep刷选,然后用awk命令拼接
chkconfig|egrep -v "network|sshd|rsyslog|sysstat|crond"|awk '{print "chkconfig " $1 " off"}'|bash export LANG=en chkconfig|grep 3:on
方法二:先用egrep刷选,然后用sed命令拼接
chkconfig --list|grep '3:on'|egrep -v 'crond|network|rsyslog|sshd|sysstat'|awk '{print $1}'|sed -r 's#(.*)#chkconfig \1 off#g'|bash chkconfig|grep 3:on
方法三:直接使用awk
chkconfig |awk '!/crond|network|rsyslog|sshd|sysstat/{print "chkconfig "$1" off"}'|bash chkconfig|grep 3:on
8、定时自动清理邮件临时目录垃圾文件,防止磁盘的inode数被小文件占满
/var/spool/clientmqueue centos5临时邮件目录 *****
|
sendmail临时邮件目录,有许多原因会导致这个目录碎文件很多 例如:crontab定时任务命令不加>dev/null等,并且sedmail服务没开。工作中偶尔会因为该目录文件太多,导致/var所在的分区inode数量被消耗尽,无法在写入文件 |
/var/spool/postfix/maildrop/ centos6临时邮件目录 *****
|
postfix临时队列目录/var/spool/postfix/maildrop/默认定时任务执行时会给root发邮件,若邮件服务不开,就会把邮件堆到上述目录中。 当定时任务结尾不加>/dev/null 2>&1时,定时任务就会在上述目录存放大量小文件 |
9、锁定关键系统文件(加锁),如:/etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab 处理以上内容后把chattr lsattr改名(即转移走)
chattr +i /etc/passwd
10、加大文件描述符
echo '* - nofile 65535 ' >>/etc/security/limits.conf
11、修改中英文字符集
cat /etc/sysconfig/i18n ###查看字符集配文件 cp /etc/sysconfig/i18n /etc/sysconfig/i18n.ori ###备份字符集配置文件 echo 'LANG="zh_CN.UTF-8"' >/etc/sysconfig/i18n ###将需要修改的内容重定向到配置文件 source /etc/sysconfig/i18n ###让配置文件生效 cat /etc/sysconfig/i18n ##查看字符集配置文件 echo $LANG ###查看变量 ###调回英文字符 echo 'LANG="en_US.UTF-8"' >/etc/sysconfig/i18n echo $LANG source /etc/sysconfig/i18n echo $LANG
12、安装一些小软件
yum install lrzsz nmap tree dos2unix unix2dos telnet vim -y
13、命令行安全(history)
cat >>/etc/bashrc <<EOF #history HISTFILESIZE=2000 HISTSIZE=2000 HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S \`whoami\` " export HISTTIMEFORMAT EOF source /etc/bashrc
14、Linux内核参数优化/etc/sysctl.conf 执行sysctl -p生效
ulimit -a 查看属性情况
优化
cat>>/etc/sysctl.conf<<EOF net.ipv4.ip_forward = 0 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.default.accept_source_route = 0 kernel.sysrq = 0 kernel.core_uses_pid = 1 net.ipv4.tcp_syncookies = 1 kernel.msgmnb = 65536 kernel.msgmax = 65536 kernel.shmmax = 68719476736 kernel.shmall = 4294967296 net.ipv4.tcp_max_tw_buckets = 6000 net.ipv4.tcp_sack = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rmem = 4096 87380 4194304 net.ipv4.tcp_wmem = 4096 16384 4194304 net.core.wmem_default = 8388608 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.netdev_max_backlog = 262144 net.core.somaxconn = 262144 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 262144 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_syn_retries = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_fin_timeout = 1 net.ipv4.tcp_keepalive_time = 30 net.ipv4.ip_local_port_range = 1024 65000 EOF
参数解释
net.ipv4.tcp_max_tw_buckets = 6000 timewait 的数量,默认是 180000。 net.ipv4.ip_local_port_range = 1024 65000 允许系统打开的端口范围。 net.ipv4.tcp_tw_recycle = 1 启用 timewait 快速回收。 net.ipv4.tcp_tw_reuse = 1 开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接。 net.ipv4.tcp_syncookies = 1 开启 SYN Cookies,当出现 SYN 等待队列溢出时,启用 cookies 来处理。 net.core.somaxconn = 262144 web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认为 511,所以有必要调整这个值。 net.core.netdev_max_backlog = 262144 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 net.ipv4.tcp_max_orphans = 262144 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的 DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。 net.ipv4.tcp_max_syn_backlog = 262144 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有 128M 内存的系统而言,缺省值是 1024,小内存的系统则是 128。 net.ipv4.tcp_timestamps = 0 时间戳可以避免序列号的卷绕。一个 1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。 net.ipv4.tcp_synack_retries = 1 为了打开对端的连接,内核需要发送一个 SYN 并附带一个回应前面一个 SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送 SYN+ACK 包的数量。 net.ipv4.tcp_syn_retries = 1 在内核放弃建立连接之前发送 SYN 包的数量。 net.ipv4.tcp_fin_timeout = 1 如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是 60 秒。2.2 内核的通常值是 180 秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的 WEB 服务器,也有因为大 量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比 FIN-WAIT-1 要小,因为它最多只能吃掉 1.5K 内存,但是它们的生存期长些。 net.ipv4.tcp_keepalive_time = 30 当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度。缺省是 2 小时
修改Linux的/etc/security/limits.conf
* soft nofile 65535 * hard nofile 65535 soft soft nproc 32000 hard hard nproc 32000
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具