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系统优化项概述

  1. 系统最小化安装
  2. 网络配置
  3. SELinux、iptables策略配置
  4. ssh登录系统策略
  5. 调整文件描述符数量,进程及文件的打开都会小号文件描述符数量
  6. 打开系统最大连接数上限
  7. 定期更新系统时间(使其和互联网(内网)时间同步)
  8. 配置yum更新源,从国内(企业内网)更新源下载安装软件包
  9. 定时自动清理邮件临时目录垃圾文件,防止磁盘的inode数被小文件占满
  10. 精简并保留必要的开机自启动服务(如crond sshd network rsyslog sysstat)
  11. Linux内核参数优化/etc/sysctl.conf 执行sysctl -p生效
  12. 更爱系统字符集为zh_CN.UTF-8,使其支持中文,防止出现乱码
  13. 命令权限最小化:关闭危险命令
  14. 锁定关键系统文件,如:/etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/inittab 处理以上内容后把chattr lsattr改名(即转移走)
  15. 清空/etc/issue /etc/issue.net 取出系统及内核版本登录显示
  16. 清除多余的系统虚拟用户帐号
  17. sudo审计
  18. 为grub引导菜单加密
  19. 禁止主机被ping
  20. 打补丁并升级有已知漏洞的软件

  二)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

 

posted @   思维无界限  阅读(387)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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工具
点击右上角即可分享
微信分享提示

目录导航