|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
CentOS Stream作为RHEL(Red Hat Enterprise Linux)的上游开发平台,为企业和个人用户提供了一个稳定、可靠且功能丰富的操作系统环境。在当今数据驱动的世界中,有效管理系统资源是确保服务器性能、稳定性和安全性的关键。本文将全面介绍CentOS Stream中的资源管理技术,从基础配置到高级优化技巧,帮助您更好地掌控系统资源,提升服务器性能与稳定性。
系统资源监控工具
有效的资源管理始于准确的监控。CentOS Stream提供了多种工具来监控系统资源使用情况。
top命令
top是最常用的实时系统监控工具之一,可以显示系统中运行的进程以及它们对系统资源的使用情况。
运行top命令后,您会看到一个实时更新的界面,显示CPU使用率、内存使用情况、运行中的进程等信息。按q键退出top。
htop命令
htop是top的增强版,提供了更友好的用户界面和更多功能。
- # 安装htop
- sudo dnf install htop
- # 运行htop
- htop
复制代码
htop支持鼠标操作,可以使用F键进行各种操作,如排序进程、杀死进程等。
vmstat命令
vmstat报告关于进程、内存、分页、块IO、陷阱(中断)和CPU活动的信息。
- # 每2秒更新一次,共更新5次
- vmstat 2 5
复制代码
输出示例:
- procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
- r b swpd free buff cache si so bi bo in cs us sy id wa st
- 1 0 0 777420 21068 347856 0 0 41 18 57 89 1 1 97 1 0
复制代码
iostat命令
iostat用于监控系统输入/输出设备和CPU的使用情况。
- # 安装sysstat包(包含iostat)
- sudo dnf install sysstat
- # 显示CPU和设备统计信息
- iostat
- # 每2秒更新一次,共更新3次
- iostat 2 3
复制代码
sar命令
sar(System Activity Reporter)是sysstat包的一部分,用于收集、报告和保存系统活动信息。
- # 收集当天的系统活动数据
- sar -u
- # 显示内存使用情况
- sar -r
- # 显示网络统计信息
- sar -n DEV
复制代码
nmon命令
nmon是一个性能监控工具,可以同时监控系统的多个方面,如CPU、内存、磁盘、网络等。
- # 安装nmon
- sudo dnf install nmon
- # 运行nmon
- nmon
复制代码
nmon提供了交互式界面,可以按不同的键查看不同类型的系统资源使用情况。
CPU资源管理
CPU是系统中最关键的资源之一,有效管理CPU资源对系统性能至关重要。
查看CPU信息
- # 显示CPU信息
- lscpu
- # 显示/proc/cpuinfo的内容
- cat /proc/cpuinfo
- # 显示CPU核心数
- nproc
复制代码
CPU亲和性(CPU Affinity)
CPU亲和性是指将进程绑定到特定的CPU核心上运行,以减少缓存失效和上下文切换的开销。
- # 使用taskset命令设置进程的CPU亲和性
- # 启动一个进程并将其绑定到CPU 0和1
- taskset -c 0,1 your_command
- # 查看进程的CPU亲和性
- taskset -p PID
- # 修改运行中进程的CPU亲和性
- taskset -cp 0,1 PID
复制代码
CPU频率调节
CentOS Stream提供了cpufreq工具来管理CPU频率。
- # 安装cpufrequtils
- sudo dnf install cpufrequtils
- # 查看CPU频率信息
- cpufreq-info
- # 设置CPU频率调节策略
- # performance: 最高性能
- # powersave: 最低功耗
- # userspace: 用户空间控制
- # ondemand: 按需调节
- # conservative: 保守调节
- cpufreq-set -g performance
- # 设置特定CPU的频率调节策略
- cpufreq-set -c 0 -g performance
复制代码
使用nice和renice调整进程优先级
nice值范围从-20(最高优先级)到19(最低优先级),默认值为0。
- # 以指定优先级启动进程
- nice -n 10 your_command
- # 修改运行中进程的优先级
- renice 10 PID
- # 修改用户所有进程的优先级
- renice 10 -u username
复制代码
使用systemd管理CPU资源
systemd提供了资源控制功能,可以限制服务对CPU的使用。
- # 创建一个服务文件
- sudo nano /etc/systemd/system/myapp.service
复制代码
服务文件示例:
- [Unit]
- Description=My Application
- [Service]
- ExecStart=/path/to/your/application
- CPUQuota=50% # 限制CPU使用率为50%
- CPUAffinity=0 1 # 绑定到CPU 0和1
- [Install]
- WantedBy=multi-user.target
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动服务
- sudo systemctl start myapp
- # 启用服务开机自启
- sudo systemctl enable myapp
复制代码
使用cgroups控制CPU资源
cgroups(控制组)是Linux内核的一个功能,可以限制、记录和隔离进程组使用的物理资源。
- # 安装cgroup工具
- sudo dnf install libcgroup-tools
- # 创建cgroup
- cgcreate -g cpu:/mygroup
- # 设置CPU份额(相对权重,默认1024)
- cgset -r cpu.shares=512 mygroup
- # 设置CPU使用率上限(百分比)
- cgset -r cpu.cfs_quota_us=50000 mygroup
- cgset -r cpu.cfs_period_us=100000 mygroup
- # 在cgroup中运行进程
- cgexec -g cpu:mygroup your_command
- # 将运行中的进程添加到cgroup
- cgclassify -g cpu:mygroup PID
复制代码
内存资源管理
内存是系统性能的关键因素,有效管理内存资源可以显著提高系统响应速度和稳定性。
查看内存使用情况
- # 显示内存使用情况
- free -h
- # 显示详细的内存使用情况
- cat /proc/meminfo
- # 显示进程的内存使用情况
- ps aux --sort=-%mem | head
复制代码
清理系统缓存
Linux系统会使用空闲内存作为磁盘缓存,以提高I/O性能。但在某些情况下,可能需要手动清理缓存。
- # 清理页缓存
- echo 1 > /proc/sys/vm/drop_caches
- # 清理目录项和inode缓存
- echo 2 > /proc/sys/vm/drop_caches
- # 清理页缓存、目录项和inode缓存
- echo 3 > /proc/sys/vm/drop_caches
复制代码
注意:这些命令需要root权限,并且应该谨慎使用,因为清理缓存可能会导致系统性能暂时下降。
调整虚拟内存参数
通过调整/proc/sys/vm/下的参数,可以优化系统的虚拟内存管理。
- # 查看当前虚拟内存参数
- sysctl -a | grep vm
- # 修改swappiness参数(控制使用交换空间的倾向,0-100)
- # 值越小,系统越倾向于使用物理内存;值越大,系统越倾向于使用交换空间
- sysctl -w vm.swappiness=10
- # 修改vfs_cache_pressure参数(控制回收目录项和inode缓存的倾向,默认100)
- # 值越小,系统越倾向于保留目录项和inode缓存
- sysctl -w vm.vfs_cache_pressure=50
- # 使修改永久生效
- echo "vm.swappiness=10" >> /etc/sysctl.conf
- echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
- sysctl -p
复制代码
使用swap空间
swap空间是硬盘上的一块区域,当物理内存不足时,系统会将不常用的内存页移动到swap空间。
- # 创建swap文件
- sudo fallocate -l 2G /swapfile
- sudo chmod 600 /swapfile
- sudo mkswap /swapfile
- sudo swapon /swapfile
- # 使swap文件永久生效
- echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
- # 调整swap使用策略
- # vm.swappiness参数控制使用swap的倾向,值越大,越倾向于使用swap
- sysctl -w vm.swappiness=10
- echo "vm.swappiness=10" >> /etc/sysctl.conf
- sysctl -p
复制代码
内存过度分配(Overcommit)
Linux内核允许内存过度分配,即分配的虚拟内存总量可以超过物理内存和swap空间的总和。
- # 查看当前内存过度分配策略
- cat /proc/sys/vm/overcommit_memory
- # 设置内存过度分配策略
- # 0: 启发式过度分配(默认)
- # 1: 总是允许过度分配
- # 2: 禁止过度分配超过swap空间+物理内存*overcommit_ratio
- sysctl -w vm.overcommit_memory=2
- # 设置过度分配比率(百分比,默认50)
- sysctl -w vm.overcommit_ratio=100
- # 使修改永久生效
- echo "vm.overcommit_memory=2" >> /etc/sysctl.conf
- echo "vm.overcommit_ratio=100" >> /etc/sysctl.conf
- sysctl -p
复制代码
使用cgroups控制内存资源
- # 创建cgroup
- cgcreate -g memory:/mygroup
- # 设置内存限制(字节)
- cgset -r memory.limit_in_bytes=1G mygroup
- # 设置内存+swap限制(字节)
- cgset -r memory.memsw.limit_in_bytes=2G mygroup
- # 在cgroup中运行进程
- cgexec -g memory:mygroup your_command
- # 将运行中的进程添加到cgroup
- cgclassify -g memory:mygroup PID
复制代码
使用systemd管理内存资源
- # 编辑服务文件
- sudo nano /etc/systemd/system/myapp.service
复制代码
服务文件示例:
- [Unit]
- Description=My Application
- [Service]
- ExecStart=/path/to/your/application
- MemoryLimit=1G # 限制内存使用为1GB
- MemorySwapMax=2G # 限制内存+swap使用为2GB
- [Install]
- WantedBy=multi-user.target
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动服务
- sudo systemctl start myapp
复制代码
磁盘I/O管理
磁盘I/O是系统性能的另一个关键因素,特别是在数据库和文件服务器等应用中。
查看磁盘使用情况
- # 显示磁盘空间使用情况
- df -h
- # 显示目录或文件的磁盘使用情况
- du -sh /path/to/directory
- # 显示inode使用情况
- df -i
- # 显示磁盘I/O统计信息
- iostat -xz 1
复制代码
磁盘性能测试
- # 安装hdparm
- sudo dnf install hdparm
- # 测试磁盘读取速度
- sudo hdparm -Tt /dev/sda
- # 安装fio(Flexible I/O Tester)
- sudo dnf install fio
- # 使用fio进行随机读写测试
- fio --name=randread --ioengine=libaio --iodepth=16 --rw=randread --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting --filename=/tmp/test
复制代码
文件系统优化
选择合适的文件系统和挂载选项可以显著提高磁盘I/O性能。
- # 查看当前文件系统类型
- df -T
- # 查看文件系统挂载选项
- mount | grep /dev/sda1
- # 修改/etc/fstab以优化文件系统挂载选项
- sudo nano /etc/fstab
复制代码
/etc/fstab示例:
- # 对于ext4文件系统,可以添加noatime选项来减少磁盘写入
- /dev/sda1 / ext4 defaults,noatime 0 1
复制代码
使用LVM(逻辑卷管理)
LVM提供了灵活的磁盘管理方式,可以动态调整磁盘空间。
- # 安装lvm2
- sudo dnf install lvm2
- # 创建物理卷
- sudo pvcreate /dev/sdb1
- # 创建卷组
- sudo vgcreate vg0 /dev/sdb1
- # 创建逻辑卷
- sudo lvcreate -n lv0 -L 10G vg0
- # 格式化逻辑卷
- sudo mkfs.ext4 /dev/vg0/lv0
- # 挂载逻辑卷
- sudo mkdir /mnt/data
- sudo mount /dev/vg0/lv0 /mnt/data
- # 扩展逻辑卷
- sudo lvextend -L +5G /dev/vg0/lv0
- sudo resize2fs /dev/vg0/lv0
复制代码
磁盘调度器优化
磁盘调度器决定了I/O请求的处理顺序,选择合适的调度器可以提高磁盘性能。
- # 查看当前磁盘调度器
- cat /sys/block/sda/queue/scheduler
- # 临时修改磁盘调度器
- echo noop > /sys/block/sda/queue/scheduler
- # 永久修改磁盘调度器(通过udev规则)
- sudo nano /etc/udev/rules.d/60-scheduler.rules
复制代码
udev规则示例:
- ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
- ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
复制代码
使用cgroups控制磁盘I/O资源
- # 创建cgroup
- cgcreate -g blkio:/mygroup
- # 设置读取速率限制(字节/秒)
- cgset -r blkio.throttle.read_bps_device="8:0 1048576" mygroup
- # 设置写入速率限制(字节/秒)
- cgset -r blkio.throttle.write_bps_device="8:0 1048576" mygroup
- # 在cgroup中运行进程
- cgexec -g blkio:mygroup your_command
- # 将运行中的进程添加到cgroup
- cgclassify -g blkio:mygroup PID
复制代码
使用systemd管理磁盘I/O资源
- # 编辑服务文件
- sudo nano /etc/systemd/system/myapp.service
复制代码
服务文件示例:
- [Unit]
- Description=My Application
- [Service]
- ExecStart=/path/to/your/application
- IOReadBandwidthMax=/dev/sda 1M # 限制读取带宽为1MB/s
- IOWriteBandwidthMax=/dev/sda 1M # 限制写入带宽为1MB/s
- [Install]
- WantedBy=multi-user.target
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动服务
- sudo systemctl start myapp
复制代码
网络资源管理
网络资源管理对于确保服务器网络性能和稳定性至关重要。
查看网络状态
- # 显示网络接口信息
- ip addr show
- # 显示网络连接状态
- ss -tuln
- # 显示网络统计信息
- netstat -s
- # 显示网络带宽使用情况
- iftop -n
复制代码
网络接口优化
- # 查看网络接口参数
- ethtool eth0
- # 修改网络接口MTU(最大传输单元)
- ip link set eth0 mtu 9000
- # 启用或禁用网络接口
- ip link set eth0 up
- ip link set eth0 down
- # 修改网络接口队列长度
- ip link set eth0 txqueuelen 10000
复制代码
网络内核参数优化
- # 查看当前网络内核参数
- sysctl -a | grep net
- # 修改网络内核参数
- # 增加TCP连接队列长度
- sysctl -w net.core.somaxconn=65536
- # 增加TCP缓冲区大小
- sysctl -w net.core.rmem_max=16777216
- sysctl -w net.core.wmem_max=16777216
- sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
- sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
- # 启用TCP窗口缩放
- sysctl -w net.ipv4.tcp_window_scaling=1
- # 启用TCP选择性确认
- sysctl -w net.ipv4.tcp_sack=1
- # 启用TCP时间戳
- sysctl -w net.ipv4.tcp_timestamps=1
- # 启用TCP BBR拥塞控制算法
- sysctl -w net.ipv4.tcp_congestion_control=bbr
- # 使修改永久生效
- cat >> /etc/sysctl.conf << EOF
- net.core.somaxconn=65536
- net.core.rmem_max=16777216
- net.core.wmem_max=16777216
- net.ipv4.tcp_rmem="4096 87380 16777216"
- net.ipv4.tcp_wmem="4096 65536 16777216"
- net.ipv4.tcp_window_scaling=1
- net.ipv4.tcp_sack=1
- net.ipv4.tcp_timestamps=1
- net.ipv4.tcp_congestion_control=bbr
- EOF
- # 应用修改
- sysctl -p
复制代码
使用tc(流量控制)管理网络带宽
tc是Linux内核中的流量控制工具,可以用来限制、调度和分类网络流量。
- # 安装tc
- sudo dnf install tc
- # 创建根队列规则
- tc qdisc add dev eth0 root handle 1: htb default 30
- # 创建主类
- tc class add dev eth0 parent 1: classid 1:1 htb rate 1000mbit
- # 创建子类
- tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500mbit ceil 1000mbit
- tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300mbit ceil 1000mbit
- tc class add dev eth0 parent 1:1 classid 1:30 htb rate 200mbit ceil 1000mbit
- # 创建过滤器
- tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10
- tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 443 0xffff flowid 1:20
- # 显示队列规则
- tc qdisc show dev eth0
- # 显示类
- tc class show dev eth0
- # 显示过滤器
- tc filter show dev eth0
- # 删除队列规则
- tc qdisc del dev eth0 root
复制代码
使用cgroups控制网络资源
- # 创建cgroup
- cgcreate -g net_cls:/mygroup
- # 设置网络类ID
- cgset -r net_cls.classid=0x00100001 mygroup
- # 创建tc过滤器以匹配cgroup
- tc filter add dev eth0 parent 1:0 protocol ip prio 10 handle 1: cgroup
- # 在cgroup中运行进程
- cgexec -g net_cls:mygroup your_command
- # 将运行中的进程添加到cgroup
- cgclassify -g net_cls:mygroup PID
复制代码
使用Firewalld管理网络访问
Firewalld是CentOS Stream中的默认防火墙管理工具,可以简化防火墙配置。
- # 启动并启用firewalld
- sudo systemctl start firewalld
- sudo systemctl enable firewalld
- # 查看防火墙状态
- sudo firewall-cmd --state
- # 查看默认区域
- sudo firewall-cmd --get-default-zone
- # 查看活动区域
- sudo firewall-cmd --get-active-zones
- # 查看区域中的规则
- sudo firewall-cmd --list-all --zone=public
- # 开放端口
- sudo firewall-cmd --permanent --zone=public --add-port=80/tcp
- sudo firewall-cmd --reload
- # 开放服务
- sudo firewall-cmd --permanent --zone=public --add-service=http
- sudo firewall-cmd --reload
- # 限制IP访问
- sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept'
- sudo firewall-cmd --reload
复制代码
进程和服务管理
有效管理进程和服务是系统资源管理的重要组成部分。
查看和管理进程
- # 查看所有进程
- ps aux
- # 查看特定进程
- ps aux | grep process_name
- # 查看进程树
- pstree
- # 查看进程打开的文件
- lsof -p PID
- # 查看进程内存映射
- cat /proc/PID/maps
- # 终止进程
- kill PID
- kill -9 PID # 强制终止
- # 终止所有同名进程
- killall process_name
- pkill process_name
复制代码
使用systemd管理服务
- # 启动服务
- sudo systemctl start service_name
- # 停止服务
- sudo systemctl stop service_name
- # 重启服务
- sudo systemctl restart service_name
- # 重新加载服务配置
- sudo systemctl reload service_name
- # 启用服务开机自启
- sudo systemctl enable service_name
- # 禁用服务开机自启
- sudo systemctl disable service_name
- # 查看服务状态
- sudo systemctl status service_name
- # 查看所有服务状态
- sudo systemctl list-units --type=service
- # 查看服务日志
- sudo journalctl -u service_name
- # 查看服务实时日志
- sudo journalctl -fu service_name
复制代码
使用systemd管理服务资源限制
- # 创建或编辑服务文件
- sudo nano /etc/systemd/system/myapp.service
复制代码
服务文件示例:
- [Unit]
- Description=My Application
- After=network.target
- [Service]
- ExecStart=/path/to/your/application
- User=myuser
- Group=mygroup
- # CPU限制
- CPUQuota=50%
- CPUAffinity=0 1
- # 内存限制
- MemoryLimit=1G
- MemorySwapMax=2G
- # 磁盘I/O限制
- IOReadBandwidthMax=/dev/sda 1M
- IOWriteBandwidthMax=/dev/sda 1M
- # 进程数限制
- TasksMax=100
- # 文件描述符限制
- LimitNOFILE=65536
- # 重启策略
- Restart=on-failure
- RestartSec=5s
- [Install]
- WantedBy=multi-user.target
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动服务
- sudo systemctl start myapp
- # 启用服务开机自启
- sudo systemctl enable myapp
复制代码
使用cron和systemd timer管理定时任务
crontab示例:
- # 每天凌晨3点执行备份脚本
- 0 3 * * * /path/to/backup_script.sh
- # 每小时执行一次系统清理脚本
- 0 * * * * /path/to/cleanup_script.sh
复制代码
使用systemd timer管理定时任务:
- # 创建服务文件
- sudo nano /etc/systemd/system/mytask.service
复制代码
服务文件示例:
- [Unit]
- Description=My Task
- [Service]
- ExecStart=/path/to/mytask.sh
- User=myuser
- Group=mygroup
复制代码- # 创建timer文件
- sudo nano /etc/systemd/system/mytask.timer
复制代码
timer文件示例:
- [Unit]
- Description=Run mytask daily
- [Timer]
- OnCalendar=daily
- Persistent=true
- [Install]
- WantedBy=timers.target
复制代码- # 启用并启动timer
- sudo systemctl enable mytask.timer
- sudo systemctl start mytask.timer
- # 查看timer状态
- sudo systemctl list-timers --all
复制代码
系统性能调优
系统性能调优是一个综合性的过程,需要考虑多个方面。
内核参数调优
- # 查看当前内核参数
- sysctl -a
- # 修改内核参数
- # 增加文件描述符限制
- sysctl -w fs.file-max=1000000
- # 增加进程数限制
- sysctl -w kernel.threads-max=1000000
- sysctl -w kernel.pid_max=4194304
- # 优化虚拟内存管理
- sysctl -w vm.swappiness=10
- sysctl -w vm.dirty_ratio=60
- sysctl -w vm.dirty_background_ratio=2
- # 优化网络参数
- sysctl -w net.core.netdev_max_backlog=10000
- sysctl -w net.ipv4.tcp_max_syn_backlog=65536
- sysctl -w net.ipv4.tcp_fin_timeout=10
- sysctl -w net.ipv4.tcp_keepalive_time=1200
- sysctl -w net.ipv4.tcp_max_tw_buckets=5000
- sysctl -w net.ipv4.ip_local_port_range="1024 65535"
- # 使修改永久生效
- cat >> /etc/sysctl.conf << EOF
- fs.file-max=1000000
- kernel.threads-max=1000000
- kernel.pid_max=4194304
- vm.swappiness=10
- vm.dirty_ratio=60
- vm.dirty_background_ratio=2
- net.core.netdev_max_backlog=10000
- net.ipv4.tcp_max_syn_backlog=65536
- net.ipv4.tcp_fin_timeout=10
- net.ipv4.tcp_keepalive_time=1200
- net.ipv4.tcp_max_tw_buckets=5000
- net.ipv4.ip_local_port_range="1024 65535"
- EOF
- # 应用修改
- sysctl -p
复制代码
文件系统调优
- # 查看文件系统挂载选项
- mount | grep /dev/sda1
- # 修改/etc/fstab以优化文件系统挂载选项
- sudo nano /etc/fstab
复制代码
/etc/fstab示例:
- # 对于ext4文件系统,可以添加以下选项:
- # noatime: 不更新访问时间,减少磁盘写入
- # nodiratime: 不更新目录访问时间,减少磁盘写入
- # data=writeback: 提高性能,但可能在断电时导致数据损坏
- # barrier=0: 禁用屏障,提高性能,但可能在断电时导致文件系统损坏
- /dev/sda1 / ext4 defaults,noatime,nodiratime,data=writeback,barrier=0 0 1
复制代码
I/O调度器调优
- # 查看当前I/O调度器
- cat /sys/block/sda/queue/scheduler
- # 临时修改I/O调度器
- echo deadline > /sys/block/sda/queue/scheduler
- # 永久修改I/O调度器(通过udev规则)
- sudo nano /etc/udev/rules.d/60-scheduler.rules
复制代码
udev规则示例:
- # 对于SSD,使用noop或deadline调度器
- ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
- # 对于HDD,使用deadline或cfq调度器
- ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
复制代码
CPU调优
- # 查看CPU频率调节策略
- cpufreq-info
- # 设置CPU频率调节策略
- cpufreq-set -g performance
- # 查看CPU亲和性
- taskset -p PID
- # 设置进程的CPU亲和性
- taskset -cp 0,1 PID
复制代码
内存调优
- # 查看内存使用情况
- free -h
- # 清理系统缓存
- echo 3 > /proc/sys/vm/drop_caches
- # 调整虚拟内存参数
- sysctl -w vm.swappiness=10
- sysctl -w vm.vfs_cache_pressure=50
- sysctl -w vm.dirty_ratio=60
- sysctl -w vm.dirty_background_ratio=2
复制代码
使用tuned进行系统调优
tuned是CentOS Stream中的一个系统调优守护进程,可以根据不同的使用场景自动调整系统参数。
- # 安装tuned
- sudo dnf install tuned
- # 启动并启用tuned
- sudo systemctl start tuned
- sudo systemctl enable tuned
- # 查看可用的调优配置文件
- sudo tuned-adm list
- # 查看当前活动的调优配置文件
- sudo tuned-adm active
- # 切换调优配置文件
- sudo tuned-adm profile throughput-performance
- # 创建自定义调优配置文件
- sudo mkdir /etc/tuned/myprofile
- sudo nano /etc/tuned/myprofile/tuned.conf
复制代码
tuned.conf示例:
- [main]
- summary=Custom profile for my application
- include=throughput-performance
- [sysctl]
- vm.swappiness=10
- vm.dirty_ratio=60
- vm.dirty_background_ratio=2
- net.ipv4.tcp_congestion_control=bbr
- [cpu]
- governor=performance
- energy_perf_bias=performance
- min_perf_pct=100
复制代码- # 启用自定义调优配置文件
- sudo tuned-adm profile myprofile
复制代码
资源限制与控制
资源限制与控制是确保系统稳定性和公平分配资源的重要手段。
使用ulimit设置用户资源限制
ulimit用于控制shell启动进程所占用的资源。
- # 查看当前资源限制
- ulimit -a
- # 设置进程最大文件描述符数
- ulimit -n 65536
- # 设置进程最大内存大小(KB)
- ulimit -v 1048576
- # 设置进程最大CPU时间(秒)
- ulimit -t 3600
- # 设置进程最大文件大小
- ulimit -f 1024000
- # 使修改永久生效(针对特定用户)
- echo "ulimit -n 65536" >> /home/username/.bashrc
- echo "ulimit -v 1048576" >> /home/username/.bashrc
- echo "ulimit -t 3600" >> /home/username/.bashrc
- echo "ulimit -f 1024000" >> /home/username/.bashrc
- # 使修改永久生效(全局)
- echo "* soft nofile 65536" >> /etc/security/limits.conf
- echo "* hard nofile 65536" >> /etc/security/limits.conf
- echo "* soft nproc 4096" >> /etc/security/limits.conf
- echo "* hard nproc 4096" >> /etc/security/limits.conf
复制代码
使用cgroups进行资源控制
cgroups是Linux内核的一个功能,可以限制、记录和隔离进程组使用的物理资源。
- # 安装cgroup工具
- sudo dnf install libcgroup-tools
- # 创建cgroup
- cgcreate -g cpu,memory,blkio,net_cls:/mygroup
- # 设置CPU限制
- cgset -r cpu.shares=512 mygroup
- cgset -r cpu.cfs_quota_us=50000 mygroup
- cgset -r cpu.cfs_period_us=100000 mygroup
- # 设置内存限制
- cgset -r memory.limit_in_bytes=1G mygroup
- cgset -r memory.memsw.limit_in_bytes=2G mygroup
- # 设置磁盘I/O限制
- cgset -r blkio.throttle.read_bps_device="8:0 1048576" mygroup
- cgset -r blkio.throttle.write_bps_device="8:0 1048576" mygroup
- # 设置网络类ID
- cgset -r net_cls.classid=0x00100001 mygroup
- # 在cgroup中运行进程
- cgexec -g cpu,memory,blkio,net_cls:mygroup your_command
- # 将运行中的进程添加到cgroup
- cgclassify -g cpu,memory,blkio,net_cls:mygroup PID
- # 查看cgroup中的进程
- cgget -g cpu,memory,blkio,net_cls:mygroup
- # 删除cgroup
- cgdelete -g cpu,memory,blkio,net_cls:/mygroup
复制代码
使用systemd进行资源控制
systemd提供了资源控制功能,可以限制服务对系统资源的使用。
- # 创建或编辑服务文件
- sudo nano /etc/systemd/system/myapp.service
复制代码
服务文件示例:
- [Unit]
- Description=My Application
- After=network.target
- [Service]
- ExecStart=/path/to/your/application
- User=myuser
- Group=mygroup
- # CPU限制
- CPUQuota=50%
- CPUAffinity=0 1
- # 内存限制
- MemoryLimit=1G
- MemorySwapMax=2G
- # 磁盘I/O限制
- IOReadBandwidthMax=/dev/sda 1M
- IOWriteBandwidthMax=/dev/sda 1M
- # 进程数限制
- TasksMax=100
- # 文件描述符限制
- LimitNOFILE=65536
- # 重启策略
- Restart=on-failure
- RestartSec=5s
- [Install]
- WantedBy=multi-user.target
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动服务
- sudo systemctl start myapp
- # 启用服务开机自启
- sudo systemctl enable myapp
复制代码
使用namespaces进行资源隔离
namespaces是Linux内核的一个功能,可以隔离进程的资源视图,如PID、网络、挂载点等。
- # 创建新的PID namespace
- unshare --fork --pid --mount-proc bash
- # 创建新的network namespace
- ip netns add myns
- ip netns exec myns bash
- # 创建新的mount namespace
- unshare --mount bash
- # 创建新的UTS namespace(主机名和域名)
- unshare --uts bash
- # 创建新的IPC namespace
- unshare --ipc bash
- # 创建新的user namespace
- unshare --user bash
复制代码
使用容器进行资源隔离
容器技术(如Docker、Podman)利用namespaces和cgroups来提供轻量级的资源隔离。
- # 安装Podman
- sudo dnf install podman
- # 运行容器并限制资源
- podman run -d --name myapp \
- --cpus=1.5 \
- --memory=1g \
- --memory-swap=2g \
- --blkio-weight=500 \
- --pids-limit=100 \
- myimage
- # 查看容器资源使用情况
- podman stats myapp
- # 更新容器资源限制
- podman update --cpus=2 --memory=2g myapp
复制代码
高级优化技巧
在掌握了基础资源管理后,可以应用一些高级优化技巧来进一步提升系统性能。
使用NUMA优化
NUMA(Non-Uniform Memory Access)是一种多处理器系统架构,其中内存访问时间取决于处理器的内存位置。
- # 查看NUMA信息
- numactl --hardware
- # 查看进程的NUMA策略
- numastat -p PID
- # 在特定NUMA节点上运行进程
- numactl --cpunodebind=0 --membind=0 your_command
- # 修改运行中进程的NUMA策略
- numactl --cpunodebind=0 --membind=0 -P PID
复制代码
使用huge pages优化内存访问
Huge pages是大于标准页面大小的内存页面,可以减少TLB(Translation Lookaside Buffer)未命中,提高内存访问效率。
- # 查看当前huge pages设置
- cat /proc/meminfo | grep -i huge
- # 临时分配huge pages
- echo 1024 > /proc/sys/vm/nr_hugepages
- # 永久分配huge pages
- echo "vm.nr_hugepages=1024" >> /etc/sysctl.conf
- sysctl -p
- # 挂载hugetlbfs文件系统
- mkdir /mnt/hugepages
- mount -t hugetlbfs none /mnt/hugepages
- # 使挂载永久生效
- echo "none /mnt/hugepages hugetlbfs defaults 0 0" >> /etc/fstab
- # 使用huge pages运行程序
- numactl --membind=0 --cpunodebind=0 your_command
复制代码
使用IO_URING优化I/O性能
IO_URING是Linux内核中的一种新型异步I/O接口,可以显著提高I/O密集型应用的性能。
- # 检查内核是否支持IO_URING
- ls /usr/include/linux/io_uring.h
- # 安装liburing开发库
- sudo dnf install liburing-devel
- # 编译使用IO_URING的程序
- gcc -o io_uring_app io_uring_app.c -luring
复制代码
使用XDP/eBPF优化网络性能
XDP(eXpress Data Path)和eBPF(extended Berkeley Packet Filter)是Linux内核中的高性能网络处理技术。
- # 安装clang和llvm(用于编译eBPF程序)
- sudo dnf install clang llvm
- # 安装libbpf开发库
- sudo dnf install libbpf-devel
- # 编译eBPF程序
- clang -O2 -target bpf -c xdp_prog.c -o xdp_prog.o
- # 加载eBPF程序
- ip link set dev eth0 xdp obj xdp_prog.o section xdp
- # 卸载eBPF程序
- ip link set dev eth0 xdp off
复制代码
使用DPDK优化网络性能
DPDK(Data Plane Development Kit)是一组用于快速数据包处理的库和驱动程序。
- # 安装DPDK开发包
- sudo dnf install dpdk-devel
- # 设置huge pages
- echo 1024 > /proc/sys/vm/nr_hugepages
- mkdir /mnt/hugepages
- mount -t hugetlbfs nodev /mnt/hugepages
- # 绑定网卡到DPDK
- modprobe vfio-pci
- usertools/dpdk-devbind.py --bind=vfio-pci eth0
- # 编译DPDK应用
- make -C examples/helloworld
- # 运行DPDK应用
- ./examples/helloworld/build/helloworld -l 0-1 -n 4
复制代码
使用SPDK优化存储性能
SPDK(Storage Performance Development Kit)是一组用于优化存储性能的库和应用程序。
- # 安装SPDK开发包
- sudo dnf install spdk-devel
- # 设置huge pages
- echo 1024 > /proc/sys/vm/nr_hugepages
- mkdir /mnt/hugepages
- mount -t hugetlbfs nodev /mnt/hugepages
- # 绑定NVMe设备到SPDK
- modprobe uio_pci_generic
- scripts/setup.sh
- # 运行SPDK应用
- ./examples/nvme/identify/identify
复制代码
使用KSM优化内存使用
KSM(Kernel Samepage Merging)是一种内核功能,可以合并相同的内存页面,减少内存使用。
- # 启用KSM
- echo 1 > /sys/kernel/mm/ksm/run
- # 调整KSM参数
- echo 1000 > /sys/kernel/mm/ksm/pages_to_scan
- echo 20 > /sys/kernel/mm/ksm/sleep_millisecs
- # 查看KSM统计信息
- cat /sys/kernel/mm/ksm/pages_shared
- cat /sys/kernel/mm/ksm/pages_sharing
- cat /sys/kernel/mm/ksm/pages_unshared
- cat /sys/kernel/mm/ksm/pages_volatile
复制代码
使用zRAM优化交换空间
zRAM是一种在RAM中创建压缩块设备的技术,可以用作高速交换空间。
- # 安装zRAM
- sudo dnf install zram-generator
- # 配置zRAM
- sudo nano /etc/systemd/zram-generator.conf
复制代码
zram-generator.conf示例:
- [zram0]
- zram-size = 4096 # MB
- compression-algorithm = lz4
复制代码- # 启用zRAM
- sudo systemctl start systemd-zram-setup@zram0.service
- sudo systemctl enable systemd-zram-setup@zram0.service
- # 查看zRAM状态
- cat /proc/swaps
- cat /sys/block/zram0/mm_stat
复制代码
最佳实践和案例分析
Web服务器资源管理案例
假设我们有一个运行Nginx和PHP-FPM的Web服务器,需要优化其资源使用。
- # 安装Nginx和PHP-FPM
- sudo dnf install nginx php-fpm
- # 配置Nginx
- sudo nano /etc/nginx/nginx.conf
复制代码
nginx.conf示例:
- user nginx;
- worker_processes auto;
- worker_rlimit_nofile 65536;
- events {
- worker_connections 8192;
- use epoll;
- multi_accept on;
- }
- http {
- sendfile on;
- tcp_nopush on;
- tcp_nodelay on;
- keepalive_timeout 30;
- keepalive_requests 1000;
- reset_timedout_connection on;
- client_body_timeout 10;
- send_timeout 2;
-
- # Gzip压缩
- gzip on;
- gzip_vary on;
- gzip_proxied any;
- gzip_comp_level 6;
- gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
-
- # 缓存设置
- open_file_cache max=200000 inactive=20s;
- open_file_cache_valid 30s;
- open_file_cache_min_uses 2;
- open_file_cache_errors on;
-
- include /etc/nginx/conf.d/*.conf;
- }
复制代码- # 配置PHP-FPM
- sudo nano /etc/php-fpm.d/www.conf
复制代码
www.conf示例:
- [www]
- user = nginx
- group = nginx
- listen = /run/php-fpm/www.sock
- listen.owner = nginx
- listen.group = nginx
- listen.mode = 0660
- pm = dynamic
- pm.max_children = 100
- pm.start_servers = 20
- pm.min_spare_servers = 10
- pm.max_spare_servers = 30
- pm.max_requests = 1000
- php_admin_value[memory_limit] = 128M
复制代码- # 创建systemd服务文件以限制资源
- sudo nano /etc/systemd/system/nginx.service.d/override.conf
复制代码
override.conf示例:
- [Service]
- LimitNOFILE=65536
- MemoryLimit=1G
- CPUQuota=80%
复制代码- sudo nano /etc/systemd/system/php-fpm.service.d/override.conf
复制代码
override.conf示例:
- [Service]
- LimitNOFILE=65536
- MemoryLimit=2G
- CPUQuota=80%
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动并启用服务
- sudo systemctl start nginx php-fpm
- sudo systemctl enable nginx php-fpm
- # 设置内核参数
- cat >> /etc/sysctl.conf << EOF
- # 网络参数优化
- net.core.somaxconn=65536
- net.core.netdev_max_backlog=10000
- net.ipv4.tcp_max_syn_backlog=65536
- net.ipv4.tcp_fin_timeout=10
- net.ipv4.tcp_keepalive_time=1200
- net.ipv4.tcp_max_tw_buckets=5000
- net.ipv4.ip_local_port_range="1024 65535"
- net.ipv4.tcp_rmem="4096 87380 16777216"
- net.ipv4.tcp_wmem="4096 65536 16777216"
- net.ipv4.tcp_congestion_control=bbr
- # 文件系统参数优化
- fs.file-max=1000000
- vm.swappiness=10
- vm.dirty_ratio=60
- vm.dirty_background_ratio=2
- EOF
- # 应用内核参数
- sysctl -p
- # 设置文件描述符限制
- echo "* soft nofile 65536" >> /etc/security/limits.conf
- echo "* hard nofile 65536" >> /etc/security/limits.conf
复制代码
数据库服务器资源管理案例
假设我们有一个运行MySQL的数据库服务器,需要优化其资源使用。
- # 安装MySQL
- sudo dnf install mysql-server
- # 配置MySQL
- sudo nano /etc/my.cnf
复制代码
my.cnf示例:
- [mysqld]
- # 基本设置
- user = mysql
- port = 3306
- socket = /var/lib/mysql/mysql.sock
- pid-file = /var/run/mysqld/mysqld.pid
- # InnoDB设置
- innodb_buffer_pool_size = 4G # 设置为系统内存的50-70%
- innodb_buffer_pool_instances = 4
- innodb_log_file_size = 512M
- innodb_log_buffer_size = 64M
- innodb_flush_log_at_trx_commit = 2
- innodb_flush_method = O_DIRECT
- innodb_file_per_table = 1
- innodb_read_io_threads = 8
- innodb_write_io_threads = 8
- innodb_thread_concurrency = 0
- # MyISAM设置
- key_buffer_size = 256M
- myisam_sort_buffer_size = 64M
- myisam_max_sort_file_size = 10G
- myisam_repair_threads = 1
- # 连接设置
- max_connections = 500
- max_connect_errors = 100000
- back_log = 512
- max_allowed_packet = 64M
- thread_cache_size = 100
- thread_stack = 256K
- # 查询缓存设置(MySQL 8.0已移除查询缓存)
- # query_cache_type = 1
- # query_cache_size = 256M
- # query_cache_limit = 4M
- # 其他设置
- tmp_table_size = 256M
- max_heap_table_size = 256M
- sort_buffer_size = 2M
- read_buffer_size = 1M
- read_rnd_buffer_size = 2M
- join_buffer_size = 2M
- table_open_cache = 2000
- table_definition_cache = 2000
- open_files_limit = 65535
- # 日志设置
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 2
- log_queries_not_using_indexes = 1
- # 复制设置(如果需要)
- # server-id = 1
- # log-bin = mysql-bin
- # binlog_format = ROW
- # expire_logs_days = 7
复制代码- # 创建systemd服务文件以限制资源
- sudo nano /etc/systemd/system/mysqld.service.d/override.conf
复制代码
override.conf示例:
- [Service]
- LimitNOFILE=65536
- MemoryLimit=6G
- CPUQuota=90%
- TasksMax=1000
- # 使用tuned优化
- CPUSchedulingPolicy=rr
- CPUSchedulingPriority=50
- IOSchedulingClass=realtime
- IOSchedulingPriority=7
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启动并启用MySQL
- sudo systemctl start mysqld
- sudo systemctl enable mysqld
- # 设置内核参数
- cat >> /etc/sysctl.conf << EOF
- # 网络参数优化
- net.core.somaxconn=65536
- net.core.netdev_max_backlog=10000
- net.ipv4.tcp_max_syn_backlog=65536
- net.ipv4.tcp_fin_timeout=10
- net.ipv4.tcp_keepalive_time=1200
- net.ipv4.tcp_max_tw_buckets=5000
- net.ipv4.ip_local_port_range="1024 65535"
- net.ipv4.tcp_rmem="4096 87380 16777216"
- net.ipv4.tcp_wmem="4096 65536 16777216"
- net.ipv4.tcp_congestion_control=bbr
- # 文件系统参数优化
- fs.file-max=1000000
- vm.swappiness=10
- vm.dirty_ratio=60
- vm.dirty_background_ratio=2
- # 虚拟内存参数优化
- vm.nr_hugepages=1024
- EOF
- # 应用内核参数
- sysctl -p
- # 设置文件描述符限制
- echo "* soft nofile 65536" >> /etc/security/limits.conf
- echo "* hard nofile 65536" >> /etc/security/limits.conf
- # 设置huge pages
- mkdir /mnt/hugepages
- mount -t hugetlbfs nodev /mnt/hugepages
- echo "nodev /mnt/hugepages hugetlbfs defaults 0 0" >> /etc/fstab
- # 使用tuned优化
- sudo tuned-adm profile throughput-performance
复制代码
容器化应用资源管理案例
假设我们有一个运行Docker/Podman容器的应用服务器,需要优化其资源使用。
- # 安装Podman
- sudo dnf install podman
- # 创建Pod
- podman pod create --name myapp -p 80:80 -p 443:443
- # 运行Web服务器容器
- podman run -d --name webserver --pod myapp \
- --cpus=2 \
- --memory=1g \
- --memory-swap=2g \
- --blkio-weight=500 \
- --pids-limit=100 \
- -v /var/www/html:/var/www/html:Z \
- nginx:alpine
- # 运行应用服务器容器
- podman run -d --name appserver --pod myapp \
- --cpus=4 \
- --memory=2g \
- --memory-swap=4g \
- --blkio-weight=500 \
- --pids-limit=200 \
- -v /var/www/app:/var/www/app:Z \
- myapp:latest
- # 运行数据库容器
- podman run -d --name database --pod myapp \
- --cpus=2 \
- --memory=4g \
- --memory-swap=6g \
- --blkio-weight=700 \
- --pids-limit=100 \
- -v /var/lib/mysql:/var/lib/mysql:Z \
- mysql:8.0
- # 查看容器资源使用情况
- podman stats
- # 创建systemd服务文件以管理Pod
- sudo nano /etc/systemd/system/myapp-pod.service
复制代码
myapp-pod.service示例:
- [Unit]
- Description=My Application Pod
- After=network.target
- [Service]
- Restart=always
- ExecStart=/usr/bin/podman start -a myapp
- ExecStop=/usr/bin/podman stop -t 10 myapp
- KillMode=none
- Type=forking
- PIDFile=/run/user/1000/containers/overlay-containers/.../userdata/pidfile
- [Install]
- WantedBy=multi-user.target
复制代码- # 重新加载systemd配置
- sudo systemctl daemon-reload
- # 启用并启动服务
- sudo systemctl enable myapp-pod
- sudo systemctl start myapp-pod
- # 设置内核参数
- cat >> /etc/sysctl.conf << EOF
- # 网络参数优化
- net.core.somaxconn=65536
- net.core.netdev_max_backlog=10000
- net.ipv4.tcp_max_syn_backlog=65536
- net.ipv4.tcp_fin_timeout=10
- net.ipv4.tcp_keepalive_time=1200
- net.ipv4.tcp_max_tw_buckets=5000
- net.ipv4.ip_local_port_range="1024 65535"
- net.ipv4.tcp_rmem="4096 87380 16777216"
- net.ipv4.tcp_wmem="4096 65536 16777216"
- net.ipv4.tcp_congestion_control=bbr
- # 文件系统参数优化
- fs.file-max=1000000
- vm.swappiness=10
- vm.dirty_ratio=60
- vm.dirty_background_ratio=2
- # 容器参数优化
- user.max_user_namespaces=28633
- EOF
- # 应用内核参数
- sysctl -p
- # 设置文件描述符限制
- echo "* soft nofile 65536" >> /etc/security/limits.conf
- echo "* hard nofile 65536" >> /etc/security/limits.conf
- # 使用tuned优化
- sudo tuned-adm profile virtual-guest
复制代码
总结
CentOS Stream资源管理是一个复杂而重要的主题,涉及系统监控、CPU管理、内存管理、磁盘I/O管理、网络资源管理、进程和服务管理、系统性能调优、资源限制与控制以及高级优化技巧等多个方面。通过本文的介绍,您应该已经掌握了CentOS Stream资源管理的基本概念和实用技巧。
有效的资源管理不仅可以提高系统性能和稳定性,还可以降低运营成本,提高资源利用率。在实际应用中,需要根据具体的应用场景和需求,选择合适的资源管理策略和工具。
最后,资源管理是一个持续的过程,需要不断地监控、分析和优化。希望本文能够帮助您更好地管理CentOS Stream系统资源,提升服务器性能与稳定性。
版权声明
1、转载或引用本网站内容(CentOS Stream资源管理全面指南从基础配置到高级优化技巧助你轻松掌控系统资源提升服务器性能与稳定性)须注明原网址及作者(威震华夏关云长),并标明本网站网址(https://pixtech.cc/)。
2、对于不当转载或引用本网站内容而引起的民事纷争、行政处理或其他损失,本网站不承担责任。
3、对不遵守本声明或其他违法、恶意使用本网站内容者,本网站保留追究其法律责任的权利。
本文地址: https://pixtech.cc/thread-41174-1-1.html
|
|