RHCA rh442 005 (NICE FIFO RR) 资源强占与分配 cpuset
作者:互联网
cgroup 容器 控制服务访问
limits 控制用户
进程管理
[root@servera ~]# ps -aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.7 180944 13844 ? Ss 08:06 0:03 /usr/lib/systemd/systemd --switc
hed-root --system --deserialize 17
root 2 0.0 0.0 0 0 ? S 08:06 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 08:06 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 08:06 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 08:06 0:00 [kworker/0:0H-kblockd]
root 8 0.0 0.0 0 0 ? I< 08:06 0:00 [mm_percpu_wq]
root 9 0.0 0.0 0 0 ? S 08:06 0:00 [ksoftirqd/0]
root 10 0.0 0.0 0 0 ? I 08:06 0:00 [rcu_sched]
%CPU cpu使用率
%MEM 内存使用率
VSZ 虚拟内存 需要多少内存 (申请内存)
RSS 真实内存 真实消耗多少内存 (真实分配)
TTY 终端 (pts伪终端 图形界面 远程连接 打开一个就增加1 pts/2..3)
STAT 状态 (I 交互 S 睡觉 < 进程优先级)
START 启动时间
TIME 持续时间(一会运行一会sleep那么,重新计算time)
[root@foundation0 ~]# ps -axo %cpu,%mem,pid,command,psr
man ps 是可以查看到加什么参数
nice fifo rr
希望进程得到更多资源,以前为nice值
nice调整进程优先级
取值范围
-20 ~ 19 数字越小优先级越高
默认优先级为0 大家都一样
renice -20 pid
资源紧张时,资源优先级才有意义
反正没人抢资源,优先级就体现不出价值
nice -n -15 ./xxx &
指定优先级运行命令
FIFO 先进先出
RR 轮询
之前绝大多是进程都属于other (nice之类)
静态优先级 1 ~ 99 FIFO RR 贵族
动态优先级: -20 ~ 19 (以前)
静态优先级 完全碾压 动态
静态优先级 数字越大优先级越高
1~99 贵族
100~139 平民
静态怎么比都比不过动态
chrt = change real time
FIFO: 先进先出特别消耗资源
这个任务不结束其他人用不了
如果一个更高优先级要启动,那么就开始强占
这个程序就会排到队列
RR: 和FIFO相同 但是RR会分配一个CPU时间片
优先级越高,分到的时间片越多
40个进程只有4个cpu,平均给40个进程分配时间
3分钟给你去买火车票,时间片用完,就排到队列最后面,管你买没买完
你开了10个后台程序, 他们会分到时间片。但你感觉都在运行
优先级越高得到时间越长
红帽7先进先出 消耗资源会卡死
红帽8却不会
运行4个dd dd if=/dev/zero of=/dev/null &
查看他们状态
因为他们优先级都一样,所以会互相分配资源
如果调整nice,那么高优先级会立马强占资源
导致机器很卡
other通过renice 给到了更多的时间片
chrt -f 10 dd if=/dev/zero of=/dev/null &
如果是先进先出,则就是吃独食,吃饱了才能让出时间片
红帽8
给出两个恰独食的命令却不会像7一样卡
chrt -f 10 dd if=/dev/zero of=/dev/null &
红帽8引入了CFS Completely Fair Scheduler
完全公平原则
就是你优先级高,你可以得到更多时间。(红帽7是活不了,会卡住)但是不能让其他优先级不能活,不能让系统卡
kernel.sched_min_granularity_ns
[root@servera proc]# sysctl -a | grep ns | grep min
kernel.sched_min_granularity_ns = 10000000
最少让每个进程得到10ms时间
进程不足这个时间,就不会被踢掉
kernel.sched_latency_ns
[root@servera proc]# sysctl -a | grep ns | grep late
kernel.sched_latency_ns = 12000000
让每个进程在这个周期内(12ms)运行一次
12ms 有10个进程就得12 / 10 每个进程运行一会儿
周期可变
在系统当中设置每一个进程至少得到10ms CPU时间
设置一个cpu调度周期,比如120ms,如果有10个进程,不考虑优先级,那么一位置每个进程得到12ms CPU时间 就可以满足第一个需求。
如果考虑优先级,有些可能得到20ms。有些只能得到10ms(保证10ms)。如果说进程数量有20个。每个进程至少得到10ms,那就意味一个CPU的调度周期需要200ms,周期可以变
可能会超过调度周期12000000,以下面的公式为准,小于调度周期还是认定这个参数kernel.sched_latency_ns
CPU 最小时间 * 进程数 = CPU调度周期
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
[root@servera proc]# sysctl -a | grep rt| grep us
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
1秒和0.95秒
如果以1秒为周期,实时优先级的进程最多只能使用0.95秒,剩下的0.05秒用于非实时进程使用
实时优先级怎么得能抢过非实时优先级
规矩则定下,让出一部分给非实时进程
cfs不要让进程处于饥饿状态,得不到进程时间(死机)
分多少给非实时进程呢,设置上面一个950000就可以
红帽8其他进程也属于other other和RR FIFO没法比较。 FIFO可能会更霸道一些,吃完才走。RR还是会考虑分时间片
将静态优先级改回实时
chrt -p -o 0 (pid)
如果两个进程,其中一个设置为fifo,且优先级也为10,另外一个设置为RR优先级也为10,则fifo优先级更高
chrt -r 10 dd if=/dev/zero of=/dev/null &
红帽8敲三个,还OK
top显示三个
fifo运行三次
top只会出现两个
第三个在后面排队
0.05还是会给非实时进程留下
但是实时进程 fifo rr还是有区别
fifo 上厕所,上完了才能出来
rr 可能一人上2分钟,上没上完不晓得
指定资源给进程使用
进程拥有cpu访问时间
进程有可能跑到不同cpu运行
一个程序运行时,他会在不同cpu上运行
一个cpu在同一时刻只能处理一个任务,那么当有多个任务运行时,就会产生运行队列,如果一个进程在运行时,会均衡运行在OS(操作系统)的多个cpu上
watch -n 1 'ps axo %cpu,%mem,pid,comm,psr | grep -w cp'
让每个cpu负载,差不多,不会说一个人忙死,其他cpu不管闲
cpu会有缓存 循环语句
一个程序运行,背后肯定有各种循环支撑
cpu之间负载均衡当然好,但
依赖缓存的程序,就不能让它到处跑
指定虚拟机运行在哪两个cpu上以提高缓存的命中率(加快速度)
进程喜欢在cpu上面跳来跳去是吧,taskset可以使进程老实在一个cpu上
[root@foundation0 ~]# cp -r /usr/ /tmp/ &
[1] 8640
[root@foundation0 ~]# taskset -p 1 8640
pid 8640's current affinity mask: 3f
pid 8640's new affinity mask: 1
[root@foundation0 ~]# taskset -p 8640
就是3f 是在6个cpu里面乱蹦
1 2 1 2 4 8 cpu的六个代号 1和2里面蹦
指定3
我给他指定1就只能在第一个cpu 0号cpu上跑
增加缓存命中率
[root@foundation0 ~]# watch -n 1 'ps axo %cpu,%mem,pid,comm,psr | grep -w cp'
这个命令可以查看过程
那这样做下次开机就不会生效
把命令做成服务,改配置文件
在服务里做成脚本
或者写在tuned里
tuned.conf
taskset -p 3 $(pidof firefox)
默认情况进程在所有的处理器上都是均衡的
每个处理器利用率是相同的,但是不能提升缓存命中率。反之可以提高缓存命中率,但是牺牲处理器的均衡
数据库sql语句都是循环,得把他放到指定的处理器上,提高命中率
即使我们指定某一个程序运行在特定的cpu上,但是这个处理器上依然有其他程序在运行,我们希望这个处理器是干净的,没有任何程序在上面运行
/root/grub2/grub2.cfg 在内核中修改参数
isolcpus = 0,1
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet isolcpus=0,1"
grub2-mkconfig -o /boot/grub2/grub.cfg
启动时,启动后。所有程序运行在0,1上。后面可以指定程序在2,3上
我给你占位置,人在多,我都会给你把位置站着
cpuset
根cpuset包含所有资源
子cpuset可以嵌套
一个cpu组称之为cpuset
每一个组称之为调度域
在cpuset下创建子文件夹
设置他运行在2-3号cpu和0号内存域
当我将14428这个pid导进子文件夹时,父文件夹的pid就会消失(因为你给他设置了特点的cpuset)
他从使用父文件的资源cpuset的资源变成使用子文件的
这不比那个指定cpu的taskset厉害一些,指定给你把环境换了
这个echo立即生效
这个内存0,因为我的系统没有设置numa的内存zone,所以只有0
这个支持嵌套,比如说父cpu用了0-1,那么子cpu的环境也可以用0-1
[root@foundation0 supermao]# cat cpuset.mem_exclusive
0
[root@foundation0 supermao]# cat cpuset.cpu_exclusive
0
[root@foundation0 supermao]# pwd
/sys/fs/cgroup/cpuset/supermao
[root@foundation0 supermao]#
这里有可打开互斥
0 可以嵌套 1 就是互斥,不可以嵌套了
我这个cpuset用过其他cpuset也能用
8个numanode,里面包含cpu和内存,可惜我没8个
numa为一个架构
numa就是将资源拆开,进行相互交换互通。就像道路一样,几条很长的道路容易堵车。但是,把冗长的道路打的四通八达就好一些
演示使用调优工具指定服务运行在特定的cpuset
[root@servera supermao12]# pwd
/usr/lib/tuned/supermao12
[root@servera supermao12]# ls
hello.sh tuned.conf
[root@servera supermao12]# cat hello.sh
#!/bin/bash
mkdir /sys/fs/cgroup/cpuset/rh442
echo 0 > /sys/fs/cgroup/cpuset/rh442/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/rh442/cpuset.mems
echo $(pidof vsftpd) > /sys/fs/cgroup/cpuset/rh442/tasks
[root@servera supermao12]# tail -n 5 tuned.conf
vm.swappiness = 10
[my_script]
type=script
script=hello.sh
[root@servera supermao12]#
这个sys/fs/cgroup/cpuset是不是太长了
[root@servera cpuset]# cd
[root@servera ~]# mkdir /cpuset
[root@servera ~]# cat /proc/filesystems
nodev sysfs
nodev rootfs
nodev ramfs
nodev bdev
nodev proc
nodev cpuset
nodev cgroup
nodev cgroup2
nodev tmpfs
nodev devtmpfs
nodev configfs
nodev debugfs
nodev tracefs
nodev securityfs
nodev sockfs
nodev dax
nodev bpf
nodev pipefs
nodev hugetlbfs
nodev devpts
nodev autofs
nodev pstore
nodev mqueue
nodev selinuxfs
nodev rpc_pipefs
xfs
[root@servera ~]# cat /proc/filesystems | grep cpuset
nodev cpuset
[root@servera ~]# mount -t cpuset nodev /cpuset/
[root@servera ~]# cd /cpuset/
[root@servera cpuset]# ls
cgroup.clone_children cpuset.cpus cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_relax_domain_level tasks
cgroup.procs cpuset.effective_cpus cpuset.memory_migrate cpuset.memory_spread_slab notify_on_release
cgroup.sane_behavior cpuset.effective_mems cpuset.memory_pressure cpuset.mems release_agent
cpuset.cpu_exclusive cpuset.mem_exclusive cpuset.memory_pressure_enabled cpuset.sched_load_balance rh442
[root@servera cpuset]#
这非常有意思,就是说那些目录都是映射上去的。我也可以把官方目录简化,设备上的cpuset 映射到了自己创建的文件夹下。其他也可以这么干,甚至可以写到etc/fstab
nodev /cpuset cpuset defalts 0 0
执行mount命令可以看到红帽是怎么干的
[root@servera /]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=912516k,nr_inodes=228129,mode=755)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime,seclabel)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_cls,net_prio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpu,cpuacct)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,rdma)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
configfs on /sys/kernel/config type configfs (rw,relatime)
/dev/vda1 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=31,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=14095)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
debugfs on /sys/kernel/debug type debugfs (rw,relatime,seclabel)
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=187292k,mode=700)
nodev on /cpuset type cgroup (rw,relatime,seclabel,cpuset)
ftp使用了哪个cpuset呢?
[root@servera /]# pidof vsftpd
812
[root@servera /]# cd /proc/812/
[root@servera 812]# cat cpuset
/rh442
[root@servera 812]#
我在内存中创建文件夹
[root@foundation0 cpuset]# pwd
/sys/fs/cgroup/cpuset
rmdir rh442
这个东西可以用删除内存的文件
容器时代,指定容器利用哪些资源
容器很容易吃光资源
rc.local开机脚本有可能不生效,而且有点过时
加倍努力吧
标签:RR,cpuset,type,rh442,cgroup,root,cpu,nodev 来源: https://www.cnblogs.com/supermao12/p/16439011.html