1、proc文件系统
1.1 系统proc目录描述
proc文件系统proc文件系统是一个伪文件系统,它提供了到内核数据结构的接口,内核在引导时将proc文件系统挂载到/proc目录上。/proc目录中的文件具有与它们所引用的参数相匹配的权限,例如对于静态信息是只读的,对于可配置设置和内核可调项是可写的。
伪文件系统中的文件(例如proc)表示其他更复杂的结构,一些/proc文件有效地指向单个内核参数,而其他/proc文件调用例程来收集多个数据并将该信息表示为流,其外观和行为与普通文件类似。在允许的情况下,编辑/proc文件中的设置与直接编辑内核参数字段相同。例如,vmstat命令读取/proc/meminfo文件,该文件提供关于系统内存使用情况的各种信息。
在开发proc文件系统之前,开发人员编写代码来访问和解析许多不同类型的内核结构以获取和设置参数,这需要理解复杂的内核结构并维护程序代码以匹配已发布的内核增强功能。通过提供proc伪文件系统作为具有传统的基于文件的语义(如打开、读取和写入)的公共接口,程序员不再需要使用内部结构进行编程。开发人员现在编写程序,使用稳定/ proc文件名访问内核参数,这些文件名在内核更新中保持一致。
/proc目录中的文件是在使用静态内核加载相应的内核结构时动态创建的,或者在引导期间或稍后运行时加载动态内核模块或驱动程序时动态创建的。
proc下目录 | 说明 |
/proc/cpuinfo | 提供有关处理器的信息 |
/proc/meminfo | 提供有关物理内存和交换内存使用情况的信息 |
/proc/swaps | 提供交换空间利用率信息 |
/proc/PID/ | 提供系统上运行的特定进程的信息 |
/proc/ | 目录下的子目录名就是进程的进程ID |
/proc/cmdline | 提供最近用于引导此内核的内核参数和选项 |
[root@test01 /proc]# ls
1 173 22 45 5128 597 857 936 diskstats loadavg sys
10 175 23 451 52 599 861 941 dma locks sysrq-trigger
11 176 24 453 5249 6 862 950 driver mdstat sysvipc
12 1766 26 46 5268 601 863 951 execdomains meminfo thread-self
1220 1768 27 467 53 602 869 952 fb misc timer_list
1226 1793 28 468 5379 603 871 966 filesystems modules tty
1229 1796 29 469 5439 604 893 982 fs mounts uptime
1236 18 3 47 5470 605 896 985 interrupts mtrr version
1240 1805 30 470 5513 705 898 988 iomem net vmallocinfo
1251 1806 32 473 553 745 899 994 ioports pagetypeinfo vmstat
1253 1833 37 48 5539 77 9 acpi irq partitions zoneinfo
13 1841 38 49 5551 770 900 buddyinfo kallsyms sched_debug
14 1842 39 50 5591 828 907 bus kcore schedstat
15 1844 4 500 5610 829 909 cgroups keys scsi
16 1845 40 5029 5611 830 910 cmdline key-users self
17 1846 41 503 5622 831 911 consoles kmsg slabinfo
170 2 42 504 565 832 915 cpuinfo kpagecgroup softirqs
171 20 43 5088 591 833 922 crypto kpagecount stat
172 21 44 51 593 834 934 devices kpageflags swaps
进入PID=1(root)的目录查看
[root@test01 /proc]# cd 1
[root@test01 /proc/1]# ls
attr cpuset loginuid numa_maps sched status
autogroup cwd map_files oom_adj schedstat syscall
auxv environ maps oom_score sessionid task
cgroup exe mem oom_score_adj setgroups timens_offsets
clear_refs fd mountinfo pagemap smaps timers
cmdline fdinfo mounts patch_state smaps_rollup timerslack_ns
comm gid_map mountstats personality stack uid_map
coredump_filter io net projid_map stat wchan
cpu_resctrl_groups limits ns root statm
1.2 内核可调参数
通过调整/proc/sys/目录,可以对系统内核立即进行调整
尽管为调优目的所做的更改有望改善系统行为,但修改/proc/sys可调项也可能对其他生产工作负载和系统产生不利影响。
例如:增加内核分配的TCP内存缓冲区的大小可以提高网络吞吐量。但是,这种更改会导致内核为系统建立或接收的每个TCP连接使用更多的内存。具有大量网络连接的系统将消耗更多内存,从而限制了用户空间应用程序可用的内存。
由于所有/proc/sys文件更改都直接写入内存中的内核,因此在重新启动时更改不会持久,内核可调设置将恢复到内核模块的默认设置,除非在适当的配置文件中持久化配置,/proc/sys目录树包含几个用于内核可调参数的子目录
/proc/sys可调参数的子目录 | 说明 |
/proc/sys/dev | 包含适用于RAID设备、CD-ROM、SCSI设备和一个或多个并行端口等系统设备的可调参数 |
/proc/sys/fs | 包含文件系统相关的可调参数。例如:配额处理参数 |
/proc/sys/kernel | 包含更改内核内部工作方式的可调参数。例如:共享内存设置。 |
/proc/sys/net | 包含更改网络设置的可调参数。例如:接收和发送套接字缓冲区大小。 |
/proc/sys/vm | 包含改变内核虛拟内存管理的可调参数。例如:大页面的数量。 |
[root@test01 ~]# cd /proc/sys
[root@test01 /proc/sys]# ls
abi crypto debug dev fs kernel net sunrpc user vm
[root@test01 /proc/sys]# ls -l /proc/sys/kernel/osrelease
-r--r--r--. 1 root root 0 Feb 15 13:28 /proc/sys/kernel/osrelease
[root@test01 /proc/sys]# ls -l /proc/sys/kernel/threads-max
-rw-r--r--. 1 root root 0 Feb 15 13:28 /proc/sys/kernel/threads-max
# osrelease文件包含操作系统版本,该版本只会在操作系统更新期间修改,而不会手动修改
[root@test01 /proc/sys]# cat /proc/sys/kernel/osrelease
4.18.0-269.el8.x86_64
# threadmax文件是可写的,可以通过编辑来设置并发进程线程的最大数量
[root@test01 /proc/sys]# cat /proc/sys/kernel/threads-max
29570
1.3 调整内核参数
管理员可以修改正在运行的系统上的大多数内核可调参数,以改变当前系统或应用程序的行为。这些参数直接在内存中修改,并将在下次重新启动时失效。要设置在重新启动时持久存在的参数值,需要在持久配置文件中创建设置。
调整内核参数方式:
- 使用编辑工具或重定向修改/proc/sys目录
- 使用sysctl命令设置参数
- 在/etc/sysctl.d/目录下为配置文件中的参数创建项
1.4 从命令行修改内核参数
root用户可以编辑可写的/proc/sys文件,对正在运行的内核立即生效。
通常使用echo命令将设置重定向为单值可调参数,但这种更改不会在重新引导期间持续存在,内核可调对象的虚线名称与/proc/sys.中的目录结构相匹配
布尔值示例:net.ipv4.icmp_echo_ignore_all包含布尔值,设置不同布尔值结果不同
net.ipv4.icmp_echo_ignore_all值 | 说明 |
0 | 允许ping(默认值) |
1 | 忽略ping |
# 检查/proc/sys/ net/ipv4/icmp_echo_ignore_all当前设置
[root@test01 ~]# cat /proc/sys/net/ipv4/icmp_echo_ignore_all
0
# ping本机,可以ping通
[root@test01 ~]# ping -c1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.175 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.175/0.175/0.175/0.000 ms
# 使用echo修改内核参数(忽略icmp请求)
[root@test01 ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 由于存在ipv6解析,ping是通的
[root@test01 ~]# ping -c1 localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.153 ms
--- localhost ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.153/0.153/0.153/0.000 ms
# ping ipv4地址,发现无法ping通
[root@test01 ~]# ping -c1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
# 将内核参数修改回去
[root@test01 ~]# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
# 此时能够ping通
[root@test01 ~]# ping -c1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.175 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.175/0.175/0.175/0.000 ms
多参数示例:net.ipv4.tcp_rmem包含多个值,调整内核参数也要包含多个值
# 查看内核默认参数
[root@test01 ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
# 通过echo修改内核参数
[root@test01 ~]# echo "8192 87380 6291456" > /proc/sys/net/ipv4/tcp_rmem
[root@test01 ~]# cat /proc/sys/net/ipv4/tcp_rmem
8192 87380 6291456
1.5 使用sysctl修改内核参数
sysctl命令直接按名称修改内核可调项。该命令可以编辑可调,列出可用的可调项,并从指定的配置文件中加载和应用设置。
sysctl参数 | 说明 |
-a | 列出所有可调项 |
-n 内核参数 | 列出内核参数值 |
-w 内核参数 | 修改内核参数值 |
列出所有可调项
# 使用sysctl -a列出所有可调项
[root@test01 ~]# sysctl -a | head -n10
abi.vsyscall32 = 1
crypto.fips_enabled = 0
debug.exception-trace = 1
debug.kprobes-optimization = 1
dev.cdrom.autoclose = 1
dev.cdrom.autoeject = 0
dev.cdrom.check_media = 0
dev.cdrom.debug = 0
dev.cdrom.info = CD-ROM information, Id: cdrom.c 3.20 2003/12/17
dev.cdrom.info =
列出内核参数值
[root@test01 ~]# sysctl -n net.ipv4.
Display all 532 possibilities? (y or n)
[root@test01 ~]# sysctl -n net.ipv4.icmp_echo_ignore_all
0
[root@test01 ~]# sysctl -n net.ipv4.tcp_rmem
8192 87380 6291456
修改内核参数值
# 修改之前的ping参数,发现成功调整,已经不能ping通了
[root@test01 ~]# sysctl -w net.ipv4.icmp_echo_ignore_all=1
net.ipv4.icmp_echo_ignore_all = 1
[root@test01 ~]# ping 127.0.0.1 -c1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
# 查询net.ipv4.icmp_echo_ignore_all值
[root@test01 ~]# sysctl -n net.ipv4.icmp_echo_ignore_all
1
# 将net.ipv4.icmp_echo_ignore_all的值修改成0
[root@test01 ~]# sysctl -w net.ipv4.icmp_echo_ignore_all=0
net.ipv4.icmp_echo_ignore_all = 0
# 发现又可以ping通了
[root@test01 ~]# ping 127.0.0.1 -c1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.227 ms
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.227/0.227/0.227/0.000 ms
# =================================================
# 书上的一个例子,虚拟机交换内存值,值越大,越积极将内容写入交换分区。值越小,越不积极将内容写入交换分区
# 发现默认值是30
[root@test01 ~]# sysctl -n vm.swappiness
30
# 将vm.swappiness值调整为10
[root@test01 ~]# sysctl -w vm.swappiness=10
vm.swappiness = 10
[root@test01 ~]# sysctl -n vm.swappiness
10
1.6 持久化修改内核参数
1 修改配置文件
修改/proc/sys目录下参数或使用sysctl修改内核参数会在重启时失效,如果要持久化调整内核参数,可以将文件放置在以下几个目录中
- /etc/sysctl.d/*.conf
- /run/sysctl.d/*.conf
- /usr/lib/sysctl.d/*.conf
通常建议将修改的信息放置在/etc/sysctl.d/*.conf下,因为/etc/sysctl.d/目录是可以确保系统启动时加载配置,并且不受软件升级或软件厂商设置而被覆盖的影响。
# 进入/etc/sysctl.d/目录,发现里面就一个注释文件
[root@test01 ~]# cd /etc/sysctl.d/
[root@test01 /etc/sysctl.d]# ls
99-sysctl.conf
[root@test01 /etc/sysctl.d]# cat 99-sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
[root@test01 /etc/sysctl.d]# echo "net.ipv4.icmp_echo_ignore_all.cnotallow=1" > ping.conf
[root@test01 /etc/sysctl.d]# ls
99-sysctl.conf net.ipv4.icmp_echo_ignore_all.conf
[root@test01 /etc/sysctl.d]# cat ping.conf
net.ipv4.icmp_echo_ignore_all.conf=1
[root@test01 /etc/sysctl.d]# reboot
# 此时本机已经ping不通改设备了
mmx@mmxdeMacBook-Air ~ % ping 192.168.0.100
PING 192.168.0.100 (192.168.0.100): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
^C
--- 192.168.0.100 ping statistics ---
11 packets transmitted, 0 packets received, 100.0% packet loss
# 但是ssh还是可以用
mmx@mmxdeMacBook-Air ~ % ssh root@192.168.0.100
root@192.168.0.100's password:
"System is booting up. Unprivileged users are not permitted to log in yet. Please come back later. For technical details, see pam_nologin(8)."
Activate the web console with: systemctl enable --now cockpit.socket
Last login: Wed Feb 15 19:54:21 2023 from 192.168.0.13
[root@test01 ~]# sysctl -n net.ipv4.icmp_echo_ignore_all
1
# 将内核参数修改回去
[root@test01 ~]# sysctl -w net.ipv4.icmp_echo_ignore_all=0
net.ipv4.icmp_echo_ignore_all = 0
[root@test01 ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.231 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.066 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.061 ms
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 312ms
rtt min/avg/max/mdev = 0.061/0.104/0.231/0.073 ms
2 使用sysctl -p加载配置
修改完后,可以不用重启电脑,使用sysctl -p加载配置文件可以直接生效
[root@test01 ~]# sysctl -n net.ipv4.icmp_echo_ignore_all
0
[root@test01 ~]# sysctl -p /etc/sysctl.d/ping.conf
net.ipv4.icmp_echo_ignore_all = 1
[root@test01 ~]# sysctl -n net.ipv4.icmp_echo_ignore_all
1
2、sysfs文件系统
sysfs文件系统也是一个伪文件系统,挂载在/sys目录上,/sys下的文件提供了对作为内核模块加载的设备、文件系统和其他软件的信息和参数的访问。与/proc类似,/sys文件系统显示的文件具有它们所表示的结构的权限。有些是只读信息,有些是可写权限。sysfs树曾经是/proc的一部分,但为了增加内核的稳定性,它被移到了自己的文件系统中,因为设备驱动程序是由具有不同经验水平的广泛贡献者编写的。
/sys下常用子目录 | 说明 |
/sys/module | 包含有关当前在单独的子目录下加载在内核中的内核模块的信息 |
/sys/devices | 包含有关附加到系统的设备属性的信息 |
/sys/bus | 包含内核中各种总线类型的信息 |
/sys/dev | 包含有关系统上块和字符设备的信息。 |
2.1 配置模块参数
Linux内核是模块化的,允许仅在需要时自动加载设备驱动程序和组件,并在不再需要时卸载。许多内核模块都有可修改的设置,当模块加载时,所有内核模块设置被加载或设置为默认设置,通过sysfs暴露的参数可以在运行系统中修改。
大多数内核模块在内核文档包中包含说明文档,包括参数设置。使用它们 modinfo命令查询当前加载的模块。modinfo命令列出了模块信息,例如其文件名、许可证、描述和可配置参数。
2.2 查看模块名
使用modinfo查看模块,modinfo 模块名
[root@test01 ~]# modinfo loop
filename: /lib/modules/4.18.0-269.el8.x86_64/kernel/drivers/block/loop.ko.xz
alias: devname:loop-control
alias: char-major-10-237
alias: block-major-7-*
license: GPL
rhelversion: 8.4
srcversion: 4A8B2DD89B44DC743283247
depends:
intree: Y
name: loop
vermagic: 4.18.0-269.el8.x86_64 SMP mod_unload modversions
sig_id: PKCS#7
signer: CentOS kernel signing key
sig_key: 40:7E:C6:AE:74:A5:EC:07:82:F2:37:AA:CE:71:7B:DE:BA:BD:9A:6F
sig_hashalgo: sha256
signature: 53:35:85:7D:C5:F8:C6:C9:6D:3E:87:17:6E:AA:B9:64:65:ED:BF:BE:
5A:55:87:35:30:93:C5:8A:3D:C7:B1:A9:1D:AA:43:64:E1:58:E5:DF:
55:65:45:3D:63:5B:FD:96:CE:94:54:DF:AD:F6:1C:6F:E0:8A:B9:16:
49:F8:7B:6E:A0:92:B0:14:66:A2:0A:25:F2:DD:1E:FB:D7:C2:22:12:
60:4C:03:40:8C:D9:8D:3D:77:6E:7E:0E:09:BD:05:69:7A:79:C8:91:
C0:36:96:5C:6C:0A:A2:E6:D1:66:EB:1B:D6:BE:8B:9C:47:D6:2E:1D:
6E:8E:2D:00:88:34:90:69:54:AA:2E:79:08:38:72:53:67:8A:80:92:
30:D0:CB:56:28:BD:83:C0:71:48:2D:16:16:D9:53:47:31:CD:52:7C:
B2:B4:81:BA:FD:D2:C2:56:28:EC:9B:82:B4:3F:08:AA:DB:4E:B1:BC:
C9:DC:86:55:B2:4F:CC:9B:90:EA:1D:D7:DC:31:55:8C:29:47:03:C8:
DB:87:FC:44:B6:2C:8D:D8:49:18:59:8C:FE:A1:80:54:BB:4C:D0:04:
F2:EF:5F:6F:75:95:B5:0C:1F:71:CE:B6:C2:C9:B6:74:03:F3:51:F5:
50:DB:12:3F:E1:0E:33:C9:5D:8A:AC:9A:19:5A:59:99:19:71:F3:E5:
BB:DB:D7:07:96:AF:F2:88:53:7B:66:74:CD:EE:71:38:B0:DA:06:DC:
0A:6F:D6:A9:BA:F1:DD:D8:D4:AC:80:C0:FF:00:8D:3F:6E:50:26:23:
B6:82:8D:53:8C:8D:B5:B2:59:B6:6D:12:0B:6E:DA:CA:0D:0F:57:BF:
07:20:3A:41:F3:48:62:68:15:BA:73:80:AE:2D:18:D9:17:03:FC:69:
F1:EC:F5:79:84:9B:58:94:DC:91:A8:4E:B4:88:8B:60:18:4C:8A:37:
A0:A4:00:81:BE:8D:95:FB:BD:F7:FA:72:2C:AE:F7:FC:01:69:64:B2:
E9:88:0F:9E
parm: max_loop:Maximum number of loop devices (int)
parm: max_part:Maximum number of partitions per loop device (int)
2.3 列出模块可选参数
使用-p选项列出模块参数
[root@test01 ~]# modinfo -p loop
max_loop:Maximum number of loop devices (int)
max_part:Maximum number of partitions per loop device (int)
2.4 加载模块
[root@test01 /sys]# modprobe loop
[root@test01 /sys]# ls /sys/module/loop/
coresize holders initsize initstate notes parameters refcnt rhelversion sections srcversion taint uevent
2.5 查看模块参数
[root@test01 /sys]# cat /sys/module/loop/parameters/max_loop
0
2.6 修改模块参数
临时方式:modprobe 模块名 可选参数=参数值
# 首先卸载模块
[root@test01 /sys]# modprobe -r loop
# 重新加载模块
[root@test01 /sys]# modprobe loop max_loop=5
[root@test01 /sys]# cat /sys/module/loop/parameters/max_loop
5
永久方式,将文件放在/etc/modprobe.d/*.conf目录中
[root@test01 /sys]# echo options loop max_loop=5 > /etc/modprobe.d/loop.conf
[root@test01 /sys]# cat /etc/modprobe.d/loop.conf
options loop max_loop=5
# 重启系统
[root@test01 /etc/sysctl.d]# reboot
# 重新加载模块
[root@test01 ~]# modprobe loop
# 模块参数已经设置成5了
[root@test01 ~]# cat /sys/module/loop/parameters/max_loop
5
3、tuned调优服务
Red Hat Enterprise Linux提供名为tuned的调优服务,以帮助系统管理员优化不同类型工作负载用例的性能。tuned服务可以使用配置为满足特定工作负载要求的tuned配置文件,静态和动态地应用tuned调整。对于不同的tuned目标。
例如节能或网络吞吐量,存在许多预定义的tuned配置文件,tuned架构包括自定义配置文件规则以满足工作负载要求的能力。
3.1 静态调优
调优后的服务在服务启动期间或在配置文件之间切换时应用系统设置。静态调优包括设置一次性定义的sysctl和/sys参数。
使用静态调优:内核可调参数是针对总体性能预期设置的,不会随着活动级别的变化而进行调整。
3.2 动态调优
通过动态调优,调优后的服务监视系统活动并根据运行时行为更改调整设置。动态调优从所选调优概要文件的初始设置开始,不断调整以适应当前工作负载。动态调优试图平衡性能和省电,因此在高性能环境下禁用动态调优。
例如:考虑一个需要转码的视频文件。在代码转换作业期间,网络连接是不需要的,并且大多数情况下是不活动的。只有上传转码视频时才需要网络连接。网络接口不需要像默认情况下那样一直全速运行。通过动态调优,tuning可以使用调优的插件监视网络接口的低活动,并自动降低接口速度以减少电力使用。当接口活动增加一段时间后,例如转码视频开始上传时,调优的监控插件会检测并重置最大接口速度,以在较高的网络活动期间提高性能。
Red Hat Enterprise Linux 8默认禁用动态调优。在/etc/tuned/tuned-main.conf文件中将dynamic_tuning设置为1,启用动态调优。当启用动态调优时,tuning每10秒调整一次系统调优。在/etc/tuned/tuned -main.conf文件中设置update_interval,以秒为单位更改时间间隔,修改/etc/tuned/tuned-main.conf配置需要重新启动调优的服务。
# RHEL8默认禁用动态调优,要启动动态调优,将dynamic_tuning设置为1,并重启服务(每10秒调整一次系统)
[root@test01 ~]# cat /etc/tuned/tuned-main.conf | grep dynamic_tuning
dynamic_tuning = 0
[root@test01 ~]# cat /etc/tuned/tuned-main.conf | grep update_interval
update_interval = 10
3.3 安装和开启tuned
[root@test01 ~]# yum install -y tuned
[root@test01 ~]# systemctl enable tuned --now
[root@test01 ~]# systemctl status tuned
● tuned.service - Dynamic System Tuning Daemon
Loaded: loaded (/usr/lib/systemd/system/tuned.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-02-16 00:39:22 CST; 13s ago
Docs: man:tuned(8)
man:tuned.conf(5)
man:tuned-adm(8)
Main PID: 5191 (tuned)
Tasks: 6 (limit: 23656)
Memory: 19.6M
CGroup: /system.slice/tuned.service
└─5191 /usr/libexec/platform-python -Es /usr/sbin/tuned -l -P
Feb 16 00:39:21 test01 systemd[1]: Starting Dynamic System Tuning Daemon...
Feb 16 00:39:22 test01 systemd[1]: Started Dynamic System Tuning Daemon.
[root@test01 ~]#
3.4 选择调优文件
概要文件是调优服务的核心,由为特定用例配置的可调设置组成。调优的概要文件可以通过复制和编辑现有概要文件来修改,也可以通过继承和扩展概要文件来修改。Red Hat建议不要修改任何预定义配置文件,因为有些配置文件是其他配置文件的父配置文件。调优后的包提供了以下类别的预定义配置文件:
- 省电配置文件(power saving profiles)
省电配置文件通过增加磁盘回写值和禁用磁盘日志同步来支持积极的磁盘休眠。在服务器上,它为SATA主机适配器启用Aggressive Link Power Management (ALPM)节电,通过HAL禁用CD-ROM轮询,并激活调优的CPU和磁盘插件。
- 性能提升配置文件(performance boosting profiles)
性能提升配置文件禁用节能机制,启用提高磁盘和网络I/O吞吐量性能的系统设置,并禁用透明大页和NUMA平衡。这些概要文件将CPU调控器设置为性能。
tuned 调优配置文件 | 说明 |
balanced | 平衡(节能和性能之间作出妥协) |
desktop | 交互式应用程序快速响应 |
throughput-performance | 吞吐量模式 |
latency-performance | 延迟性能模式 |
network-latency | 网络延迟模式 |
network-throughput | 网络吞吐量模式 |
powersave | 节能模式 |
oracle | 基于oracle优化 |
virtual-guest | 基于虚拟机优化 |
virtual-host | 基于宿主机优化 |
3.5 命令行管理配置文件
使用tuned- adm active命令识别系统上当前活跃的调优配置文件
# 由于我使用的是虚拟机,tuned模式默认设置为virtual-guest
[root@test01 ~]# tuned-adm active
Current active profile: virtual-guest
3.6 列出所有调优选项
tuned-adm list 可以列出当前所有调优选项
[root@test01 ~]# tuned-adm list
Available profiles:
- accelerator-performance - Throughput performance based tuning with disabled higher latency STOP states
- balanced - General non-specialized tuned profile
- desktop - Optimize for the desktop use-case
- hpc-compute - Optimize for HPC compute workloads
- intel-sst - Configure for Intel Speed Select Base Frequency
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- network-latency - Optimize for deterministic performance at the cost of increased power consumption, focused on low latency network performance
- network-throughput - Optimize for streaming network throughput, generally only necessary on older CPUs or 40G+ networks
- optimize-serial-console - Optimize for serial console use.
- powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
- virtual-guest - Optimize for running inside a virtual guest
- virtual-host - Optimize for running KVM guests
Current active profile: virtual-guest
3.7 切换调优配置
如果当前活动的概要文件不满足系统的调优需求,则可以更改它。使用tuning -adm profile命令可以根据系统当前的调优需求将激活的配置文件切换到不同的配置文件。
[root@test01 ~]# tuned-adm profile throughput-performance
[root@test01 ~]# tuned-adm active
Current active profile: throughput-performance
3.8 tuned推荐调优配置文件
使用tuned-adm recommend查看系统推荐的调优配置文件
[root@test01 ~]# tuned-adm recommend
virtual-guest
3.9 关闭调优配置文件
tuned-adm off 命令可以关闭已开启的调优配置文件,在重新设置调优配置文件再次启用tuned
# 临时关闭调优配置文件
[root@test01 ~]# tuned-adm off
[root@test01 ~]# tuned-adm active
No current active profile.
# 重新配置调优配置文件为virtual-guest
[root@test01 ~]# tuned-adm profile virtual-guest
[root@test01 ~]# tuned-adm active
Current active profile: virtual-guest
4、使用web控制台管理配置文件
4.1 cockpit工具
cockpit工具可以通过web方式管理配置文件
[root@test01 ~]# systemctl enable cockpit --now
[root@test01 ~]# systemctl status cockpit
● cockpit.service - Cockpit Web Service
Loaded: loaded (/usr/lib/systemd/system/cockpit.service; static; vendor preset: disabled)
Active: active (running) since Thu 2023-02-16 02:24:40 CST; 5s ago
Docs: man:cockpit-ws(8)
Process: 7287 ExecStartPre=/usr/sbin/remotectl certificate --ensure --user=root --group=cockpit-ws --selinux-type=etc>
Main PID: 7296 (cockpit-tls)
Tasks: 1 (limit: 23656)
Memory: 3.1M
CGroup: /system.slice/cockpit.service
└─7296 /usr/libexec/cockpit-tls
Feb 16 02:24:40 test01 systemd[1]: Starting Cockpit Web Service...
Feb 16 02:24:40 test01 systemd[1]: Started Cockpit Web Service.
4.2 浏览器访问web控制台
cockpit默认监听tcp 9090端口
[root@test01 ~]# netstat -tunlp | grep 9090
tcp6 0 0 :::9090 :::* LISTEN 1/systemd
查看系统概要
4.3 使用终端
4.4 查看网络
4.5 查看服务
4.6 容器功能
之前版本还没有看到容器功能,从centos8之后发现容器功能可以使用了😊
5、定义tuned文件
调优的概要文件支持各种类型的机制来更改配置设置,例如sysctl、sysfs或内核引导参数,这些都可以作为调优插件使用。配置文件将其所有配置保存在以下目录中:
存放目录 | 说明 |
/usr/lib/tuned/ | 存储RHEL发行版提供的profile文件 |
/etc/tuned/ | 自定义profile文件 |
5.1 查看tuned文件
- [main]允许从现有调优概要文件中添加设置的摘要、描述和继承。
- [sysctl]使用sysctl插件参数设置由sysctl命令管理的各种内核可调参数。
- [vm]根据vm插件参数设置的值启用或禁用透明大页面。
- [disk]设置磁盘I/O
# 查看默认定义好virtual-guest的文件
[root@test01 /usr/lib/tuned]# cat /usr/lib/tuned/virtual-guest/tuned.conf
#
# tuned configuration
#
[main]
summary=Optimize for running inside a virtual guest
include=throughput-performance
[sysctl]
# If a workload mostly uses anonymous memory and it hits this limit, the entire
# working set is buffered for I/O, and any more write buffering would require
# swapping, so it's time to throttle writes until I/O can catch up. Workloads
# that mostly use file mappings may be able to use even higher values.
#
# The generator of dirty data starts writeback at this percentage (system default
# is 20%)
vm.dirty_ratio = 30
# Filesystem I/O is usually much more efficient than swapping, so try to keep
# swapping low. It's usually safe to go even lower than this on systems with
# server-grade storage.
vm.swappiness = 30
使用blockdev调节read_ahead_kb参数
# blockdev命令读取和调节read_ahead_kb。使用--getra和--setra选项与blockdev命令一起获取和设置提前读值
[root@test01 ~]# blockdev --getra /dev/vda
8192
[root@test01 ~]# blockdev --setra 512 /dev/vda
[root@test01 ~]# blockdev --getra /dev/vda
512
disk插件提供预读参数,该参数被设置为优化磁盘I/O
# readahead参数会影响内核在看到连续请求进入时尝试预读的数据量。内核试图预读的数据从/sys/block/device/queue/read_ahead_kb中配置的数据量的一半开始。顾名思义,这个设置是KiB。当内核看到连续访问时,它会增加预先读取的数据量,直到read_ahead_kb中定义的最大值,或者在检测到随机访问时降低这个量(必要时降为零)。
[root@test01 /usr/lib/tuned]# cat throughput-performance/tuned.conf | grep "\[disk\]" -A 4
[disk]
# The default unit for readahead is KiB. This can be adjusted to sectors
# by specifying the relevant suffix, eg. (readahead => 8192 s). There must
# be at least one space between the number and suffix (if suffix is specified).
readahead=>4096
5.2 自定义tuned文件
tuned包提供了适合大多数常见工作负载的调优配置文件。RHEL中的内置配置文件可能会从定期更新或勘误表中更改。创建自定义调优配置文件可以防止此类更新。此外,在某些情况下,需要进行更多的微调才能实现预期的性能。tuned服务支持创建和使用自定义调优配置文件。
调整后的软件包附带内置配置文件,位于在/us/lib/tuned目录中。
[root@test01 ~]# ls /usr/lib/tuned/
balanced functions network-latency powersave throughput-performance virtual-host
desktop latency-performance network-throughput recommend.d virtual-guest
/etc/tuned目录包含active_profile文件,其中包含当前活动tuned配置文件和tuned-main.conf调优配置文件的名称,该目录还将自定义配置文件配置存储在其他文件中。
[root@test01 ~]# ls /etc/tuned/
active_profile bootcmdline profile_mode recommend.d tuned-main.conf
在Linux中,/usr/lib目录包含与应用程序一起分发的库和默认配置文件。更新软件包时,可以替换应用程序文件;它们旨在因与系统相关的更改而保持不变,不得修改。由于内置tuned配置文件驻留在**/us/lib/tuned目录中,自定义配置文件不得驻留在同一个目录中,以避免软件更新期间的意外更改**。
# 创建/etc/tuned/http-performance目录
[root@test01 ~]# mkdir /etc/tuned/http-performance
在为自定义配置文件新创建的目录中,tuned使用tuned.conf配置文件。自定义配置文件的tuned.conf配置文件可能包含多个部分。其他部分是可选的。
5.3 从现有配置中继承
Main部分允许从现有调优配置文件继承设置
# 继承配置格式
[main]
include=父配置文件名称
# 例如继承network-throughput
[main]
include=network-throughput
5.4 使用插件和自定义配置文件
一个tuned配置文件使用插件来监控或调整系统上的不同子系统。有两种类型的插件:监控插件和调优插件。
调优插件 | 说明 |
disk | 提供磁盘I/O设备数量的指标 |
net | 提供传输数据包数量的指标,以及CPU负载指标的负载 |
mount | 挂载 |
vm | 内存 |
sysctl | 系统 |
script | 脚本 |
[NAME]
type=TYPE
devices=DEVICES
# 以下示例使用vm插件禁用透明的大页面
[vm]
transparent_hugepages=nerver
# 磁盘调优插件的提前可调谐会导致内核提前读取512字节块,要在设备名称与sd*匹配的所硬盘驱动器可食用通配符
[all_sd_disks]
type=disk
devices=sd*
readahead=4096
# 当调优参数不应应用于/dev/sda和/dev/sdc设备时,设备属性排除使用否定(!)设备
[not_all_sd_disks]
type=disk
devices=!sda,!sdc
readahead=4096
5.5 执行脚本文件
通过script选项可以指定要执行的shell脚本,shell脚本在**/etc/tuned/profilename目录中**,shell脚本可以从/usr/lib/tuned/functions导入常用函数。
[root@test01 ~]# cat /usr/lib/tuned/powersave/script.sh
#!/bin/sh
. /usr/lib/tuned/functions
start() {
[ "$USB_AUTOSUSPEND" = 1 ] && enable_usb_autosuspend
enable_wifi_powersave
return 0
}
stop() {
[ "$USB_AUTOSUSPEND" = 1 ] && disable_usb_autosuspend
disable_wifi_powersave
return 0
}
process $@
添加/etc/tuned/http-performance/script.sh脚本到http-performance配置文件中,在/etc/tuned/http-performance/tuned.conf中增加如下部分:
# 使用PROMATION_DIR内置函数,该函数返回配置文件的位置和调优的conf文件。
[script]
script=${1:PROFILE_DIR}/script.sh
5.6 设置sysctl参数
自定义调优配置文件可以设置sysctl参数。sysctl调优插件用于为在/proc/sys中管理的内核可调制文件设置值。在配置文件配置文件中创建一个名为[sysctl]的选项。在[sysctl]选项中,以与/etc/sysctI.conf或/etc/sysctl.conf.d/files中为自定义配置文件定义的内核可调制相同的方式设置内核可调。
# 忽略ping请求,强制减少对交换内存的使用
[sysctl]
net.ipv4.icmp_echo_ignore_all=1
vm.swappiness=5
5.7 验证自定义调优配置
激活自定义调谐配置文件后,使用tuned-adm verify 来验证当前活动配置文件是否按预期设置了可调谐文件。如果出现错误, 查看/var/log/tuned/tuned.log文件记录调优活动以及与调优事件相关的消息。
# 日志文件
[root@test01 ~]# cat /var/log/tuned/tuned.log | tail -n2
2023-02-16 04:55:58,678 INFO tuned.plugins.base: verify: passed: 'sched_wakeup_granularity_ns' = '15000000'
2023-02-16 04:55:58,678 INFO tuned.plugins.base: verify: passed: 'sched_migration_cost_ns' = '5000000'
# 验证调优配置
[root@test01 ~]# tuned-adm verify
Verfication succeeded, current system settings match the preset profile.
See TuneD log file ('/var/log/tuned/tuned.log') for details.