用于获取linux机器cpu使用率,linux cpu 频率
上一篇文章主要介绍了c组的基本概念,包括CentOS系统的缺省设置和控制工具,并以中央处理器为例介绍了c组如何控制资源。本文提供了如何使用c组来限制中央处理器的使用,以及各种c组设置对性能的影响的具体示例linux操作系统.
1 .显示当前c组信息
有两种方法可以查看系统的当前c组信息。第一种方法是使用系统d-cgls命令显示。这将返回到整个系统的c组级别,c组树的顶层由薄片组成。以下表示。巴斯h
$ systemd-cgls -无页面
1/usr/lib/systemd/systemd-switched-root-system-deserialize 22
用户。切片
() )用户-1000 .切片
(()会话-11 .范围
((9507 sshd : Tom [ priv ])
()9509sshd:Tom@pts/3
(()9510-bash
()用户0 .切片
()会话-1 .范围
())6239 sshd: root@pts/0
())6241 -zsh
()11537systemd-cgls -无页
(系统。切片
rsyslog.service
()5831 /usr/symdzh/rsyslogd -n
sshd.service
()5828 /usr/symdzh/sshd -D
tuned.service
(()5827/usr/ymdzh/python 2-es/usr/symdzh/tuned-l-p
crond.service
()5546 /usr/symdzh/crond -n
复制代码
请注意,系统c组级别的顶级由用户。切片和系统。切片组成。系统中没有虚拟机和容器正在运行,因此没有机器。切片。因此,如果中央处理器忙,用户。切片和系统。切片将分别获得50%的中央处理器使用时间。会话
在用户。切片下有用户-1000 .切片和用户0 .切片这两个子切片,因为每个子薄片都有用户ID (UID),所以哪个薄片对哪个用户例如,根据上面的输出信息,可以看到用户-1000 .切片属于用户汤姆,而用户0 .切片属于用户根。嘘
系统d-cgls命令提供c组级别的静态信息快照。要查看c组级别的动态信息,可以使用systemd-cgtop命令进行查看。工具
$ systemd-cgtop
路径任务% cpumemoryinput/s output/s
/161 1.2 161.0米- -
/system.slice - 0.1 - - -
/系统。slice/vmtoolsd。服务10.1-
/系统。切片/调谐。服务10.0 -
/系统。切片/r系统日志。服务10.0-
/系统。切片/审计。服务1 -
/系统。切片/记录码。服务1 -
/system.slice/crond.service1 - -
/system.slice/dbus.service1 - -
/system.slice/GSS代理服务器。服务1 - -
/系统。切片/左心室m2-左心室metad。服务1 -
/系统。切片/网络。服务1 -
/系统。切片/pol套件。服务1 -
/系统。slice/rpcymdzhd。服务1 -
/system.slice/sshd.service1 - -
/系统。切片/系统-Getty。slice/Getty @ tty 1 .服务1 - -
/系统。切片/系统
md-journald.service 1 - - - -
/系统。slice/systemd-logind。服务1 -
/系统。slice/systemd-udevd。服务1 -
/系统。切片/VG授权。服务1 -
/user.slice 3 - - - -
/用户。切片/用户-0。切片/会话-1。范围3 -
/用户。切片/用户-1000。切片3 -
/用户。切片/用户-1000。切片/会话-11。范围3 -
/用户。切片/用户-1001。切片/会话-8。范围3 -
复制代码
systemd-cgtop提供的统计数据和控制选项与顶端命令相似,但该命令只显示那些开启了资源统计功能的服务和切片。好比:若是你想开启sshd.service的资源统计功能,能够进行以下操做:发布
$ system CTL set-property sshd。服务CPU核算=真实内存核算=真实
复制代码
该命令会在/etc/systemd/system/sshd。服务。d/目录下建立相应的配置文件:性能
$ ll/etc/systemd/system/sshd。服务。d/
总用量8
4 -rw-r - r - 1根根28 5月31 02:24 50-CPUAccounting.conf
4 -rw-r - r - 1根根31 5月31 02:24 50内存会计。主配置文件
$ cat/etc/systemd/system/sshd。服务。d/50-CPU会计。主配置文件
[服务]
CPUAccounting=是
$ cat/etc/systemd/system/sshd。服务。d/50-内存会计。主配置文件
[服务]
内存会计=是
复制代码
配置完成以后,再重启混合硬盘服务:学习
$ systemctl守护程序-重新加载
$ systemctl重新启动混合硬盘
复制代码
这时再从新运行systemd-cgtop命令,就能看到混合硬盘的资源使用统计了:测试
开启资源使用统计功能可能会增加系统的负载。由于资源统计也会消耗CPU和内存,因此在大多数情况下使用top命令进行检查就足够了。当然是Linux系统。你可以控制一切,你可以为所欲为。
2.分配CPU相对使用时间
经过上一篇文章的学习,我们知道CPU份额可以用来设置CPU的相对使用时间。接下来,我们通过实践来验证一下。
以下实验都是在单核CPU系统上进行的。多核和单核的情况完全不同,所以在本文的最后会单独讨论。
测试对象是一个服务和两个普通用户,其中用户tom的UID是1000,可以通过以下命令查看:
$ cat /etc/passwdgrep tom
汤姆:x:1000:1000:/home/汤姆:/ymdzh/bash
复制代码
设置foo.service:
$ cat/etc/systemd/system/foo . service
[单位]
Description=没有任何用处的foo服务
after=remote-fs . target NSS-lookup . target
[服务]
ExecStart=/usr/ymdzh/sha1 sum/dev/zero
ExecStop=/ymdzh/kill-WINCH $ { main PID }
[安装]
WantedBy=多用户.目标
复制代码
/dev/zero是linux系统中一个特殊的设备文件。无私巾读的时候会提供无限的空字符,所以foo.service会不断消耗CPU资源。现在让我们将foo.service的CPU份额更改为2048:
$ mkdir/etc/systemd/system/foo . service . d
$ cat EOF/etc/systemd/system/foo . service . d/50-cpushares . conf
[服务]
CPUShares=2048
文件结束
复制代码
因为系统默认的CPU份额值是1024,当设置为2048时,foo.service会在CPU忙的时候尽力获取system.slice的所有CPU使用时间。
现在通过systemctl start foo.service启动foo服务,并使用top命令检查CPU使用情况:
目前没有其他进程在消耗CPU,所以foo.service几乎可以使用100%的CPU。
现在让我们让用户tom参与进来,首先将user-1000.slice的CPU份额设置为256:
$ system CTL set-property user-1000 . slice CPU shares=256
复制代码
使用用户tom登录系统,然后执行命令sha1sum /dev/zero再次检查CPU使用情况:
你现在是不是感觉有点迷茫?Foo.service的CPU份额是2048,而用户tom的CPU份额只有256。用户tom不是应该只能使用10%的CPU吗?回想一下,我在上一节中提到,当CPU繁忙时,user.slice和system.slice将分别获得50%的CPU使用时间。这只是这里的场景,只有user.slice下的sha1sum进程繁忙,所以它将获得50%的CPU使用时间。
最后让用户jack参与,他的CPU份额是默认值1024。使用用户jack登录系统,然后执行命令sha1sum /dev/zero再次检查CPU使用情况:
如上所述,在这个场景中,user.slice和system.slice将分别获得50%的CPU使用时间。用户tom的CPU份额是256,而用户jack的CPU份额是1024,所以用户jack的CPU使用时间是用户tom的4倍。
3.分配CPU的绝对使用时间
前面提到过,如果要严格控制CPU资源,就要设置CPU资源的使用限制,即无论CPU是否繁忙,CPU资源的使用都不能超过这个限制,可以通过CPUQuota参数来设置。让我们将用户tom的CPU配额设置为5%:
$ system CTL set-property user-1000 . slice CPU quota=5%
复制代码
这时你会看到用户tom的sha1sum进程只能获得5%左右的CPU使用时间。
如果此时停止foo.service,关闭用户jack的sha1sum进程,会看到用户tom的sha1sum进程只能获得5%左右的CPU使用时间。
如果某个非核心服务消耗了CPU资源,可以用这个方法严格限制它对CPU资源的使用,防止它影响系统中的其他重要服务。
4.动态设置cgroup
所有与cgroup相关的操作都基于内核中的cgroup虚拟文件系统。使用cgroup非常简单,只需挂载这个文件系统。默认情况下,系统安装在/sys/fs/cgroup目录中。当服务启动时,它的cgroup将被挂载到该目录下的子目录中。以foo.service为例:
先进入system.slice的CPU子系统:
$ cd /sys/fs/cgroup/cpu,cpuacct/system.slice
复制代码
检查foo.service的cgroup目录:
$ ls foo。*
zsh:没有找到匹配:foo。*
复制代码
因为没有启动foo.service,所以没有挂载cgroup目录。现在启动foo.service并再次检查它的cgroup目录:
$ ls foo.serice
c group . clone _ children c group . procs CPU acct . usage CPU . CFS _ period _ us CPU . rt _ period _ us CPU . shares notify _ on _ release
c group . event _ control cpuacct . stat cpuacct . usage _ percpu CPU . CFS _ quota _ us CPU . rt _ runtime _ us CPU . stat任务
复制代码
您还可以查看其PID和CPU份额:
$卡特彼勒foo.service/tasks
20225
$卡特彼勒foo.service/cpu.shares
2048
复制代码
理论上,我们可以在/sys/fs/cgroup目录中动态地更改cgroup的配置,但我不建议您在生产环境中这样做。如果想通过实验深入了解cgroup,可以折腾一下这个目录。
5.如果是多核CPU呢?
以上实验都是在单核CPU上进行的。我们先简单讨论一下多核的场景,以两个CPU为例。
首先说一下CPU份额。只能为单核CPU设置份额,即无论你的份额值有多大,cgroup最多只能获得100%的CPU使用时间(即1核CPU)。仍然使用本文第2节中的示例,将foo.service的CPU份额设置为2048,并启动foo.service。此时,您将看到foo.service仅获得100%的CPU使用时间,但没有完全使用两个CPU核心:
然后使用用户tom登录系统并执行命令sha1sum /dev/zero。你会发现用户tom的sha1sum进程和foo.service各使用一个CPU核:
再来说说CPUQuota,在这最后一篇文章的最后已经提到了。如果一个cgroup想完全使用两个CPU核,可以通过CPUQuota参数设置。例如:
$ system CTL set-property foo . service CPU quota=200%
复制代码
至于工艺最后能不能完全用两个CPU核,就看自己的设计支持了。
6.摘要
本文通过具体的例子来观察不同的cgroup设置对性能的影响。下一篇文章将演示如何通过cgroup限制内存使用。