一.cgconfig 设计限制策略
Cgroups这个是被cgconfig服务所控制的。如果此服务没有启动,在根目录下的cgroup文件夹里就不会存在内容。
1.安装cgroup
yum install libcgroup
2.# /etc/init.d/cgconfig status 查看cgroup的状态,如果没有启动,则不会有/cgroup目录
3.# /etc/init.d/cgconfig start
4.vim /etc/cgconfig.conf 可以修改cgroup的配置文件,将cpu与memory的信息合并。
mount {
cpuset = /cgroup/cpuset;
# cpu = /cgroup/cpu;
cpuacct = /cgroup/cpuacct;
# memory = /cgroup/memory;
cpu = /cgroup/cpumem;
memory = /cgroup/cpumem;
devices = /cgroup/devices;
freezer = /cgroup/freezer;
net_cls = /cgroup/net_cls;
blkio = /cgroup/blkio;
5.# /etc/init.d/cgconfig restart 重新启动cgroup,可以在/cgroup/目录下发现cpumem目录文件,原来的cpu,memory目录失效,里面无内容。
注意:重启cgconfig时需退出cgroup目录再重启
cgred 将需要限制的程序应用到cgroup中
6.# lssubsys -m 查看当前系统已挂载的子系统
cpuset /cgroup/cpuset
cpu /cgroup/cpu
cpuacct /cgroup/cpuacct
memory /cgroup/memory
devices /cgroup/devices
freezer /cgroup/freezer
net_cls /cgroup/net_cls
blkio /cgroup/blkio
二.cpu管理
1.#vim /etc/cgconfig.conf
在配置文件中追加两个组
group lesscpu{ #占用cpu较小的组
cpu{
}
}
group morecpu{ #占用cpu较多的组
cpu{
}
}
2.#/etc/init.d/cgconfig restart 重新启动配置文件
3.#cd /cgroup/cpu/
ls
可以看到多出两个目录文件 lesscpu,morecpu。
lesscpu,morecpu目录文件中的内容与父cpu目录中的内容完全一样。
4.# cat /cgroup/cpu/cpu.shares 查看cpu父亲目录cpu.shares的大小为1024
1024
5.#vim /etc/cgconfig.conf
group lesscpu{
cpu{
cpu.shares=100; 根据父cpu的cpu.shares来设定,当发生资源抢占时,有大约1/10的抢占几率
}
}
group morecpu{
cpu{
cpu.shares=200; 有大约2/10的抢占几率
}
6.#/etc/init.d/cgconfig restart 重新启动配置文件
7.#cat /cgroup/cpu/lesscpu/cpu.shares
100
可以看到lesscpu的cpu.share已经发生改变
8.如果有多个个cpu在运行,可以关闭掉一定数目的cpu
(1)查看cpu运行状况
#lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3 可以看到在线活跃的cpu号为0到3
(2)]# cat /sys/devices/system/cpu/cpu1/online 查看cpu1的在线状况为1
1
注:cpu0默认不能关闭
(3)# echo 0 >> /sys/devices/system/cpu/cpu1/online
(4)# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0,2,3
Off-line CPU(s) list: 1 可以看到已经成功关闭cpu1
9.使用cpu进行控制进程运行
(1)]# cgexec -g cpu:lesscpu time dd if=/dev/zero of=/dev/null bs=1M count=200000
200000+0 records in
200000+0 records out
209715200000 bytes (210 GB) copied, 19.2698 s, 10.9 GB/s
0.01user 9.60system 0:19.27elapsed 49%CPU (0avgtext+0avgdata 7600maxresident)k
0inputs+0outputs (0major+516minor)pagefaults 0swaps
(2)# cgexec -g cpu:morecpu time dd if=/dev/zero of=/dev/null bs=1M count=200000
200000+0 records in
200000+0 records out
209715200000 bytes (210 GB) copied, 14.4771 s, 14.5 GB/s
0.01user 9.61system 0:14.47elapsed 66%CPU (0avgtext+0avgdata 7600maxresident)k
0inputs+0outputs (0major+518minor)pagefaults 0swaps
如图,可以看到使用morecpu策略的进程消耗的资源是lesscpu的两倍
应用场景:当服务器有一个大型的应用程序运行时,可以给其900的cpu资源,当没有其它进程与它竞争时,它可以满负载运行,当有资源竞争时,给它大约90%cpu资源使用率,避免机器的卡死。
三.memory管理
1.使用系统自带的tmpfs文件系统,
(1)创建临时目录
# mkdir /mnt/tmpfs/
(2)将tmpfs文件系统挂载在/mnt/tmpfs/目录下
# mount -t tmpfs none /mnt/tmpfs/
(3)查看挂载情况
# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/VolGroup-lv_root 6926264 1360608 5213812 21% /
tmpfs 251136 0 251136 0% /dev/shm
/dev/sda1 495844 33463 436781 8% /boot
none 251136 0 251136 0% /mnt/tmpfs
挂载的内存盘大小实际是系统剩余的内存大小,现在往/mnt/tmpfs里面写东西实际是往内存中写入
2.添加内存管理信息
# vim /etc/cgconfig.conf
group poormem{
memory{
memory.limit_in_bytes=134217728;
}
}
3.# /etc/init.d/cgconfig restart
4.cd /mnt/tmpfs
(1)
<1>[root@desktop113 tmpfs]# cgexec -g memory:poormem dd if=/dev/zero of=test bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0327344 s, 3.2 GB/s
<2>[root@desktop113 tmpfs]# free
total used free shared buffers cached
Mem: 502272 273880 228392 0 8712 154364
-/+ buffers/cache: 110804 391468
Swap: 835576 0 835576
由于前面限制的内存大小是100M,所以内存够用,没有使用到交换分区
(2)
<1>[root@desktop113 tmpfs]# cgexec -g memory:poormem dd if=/dev/zero of=test bs=1M count=1000
dd: writing `test': No space left on device
246+0 records in
245+0 records out
257163264 bytes (257 MB) copied, 0.736284 s, 349 MB/s
<2>[root@desktop113 tmpfs]# free
total used free shared buffers cached
Mem: 502272 302036 200236 0 8712 118248
-/+ buffers/cache: 175076 327196
Swap: 835576 184856 650720
当往内存中写入1G的数据时可以看到虽然内存只使用了限制的大小,但是交换分区swap被使用了
5.继续进行限制,不允许使用交换分区大小
(1)# vim /etc/cgconfig.conf
group poormem{
memory{
memory.limit_in_bytes=134217728;
memory.memsw.limit_in_bytes=134217728; 物理内存加交换分区大小
}
(2)# /etc/init.d/cgconfig restart
注意:必须退出cgroup目录再进行重启,不然会有报错的
(3)[root@desktop113 tmpfs]# cgexec -g memory:poormem dd if=/dev/zero of=test bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.032748 s, 3.2 GB/s
当写入100M的数据时,是在系统限制内的,所以可以顺利执行
(4)[root@desktop113 tmpfs]# cgexec -g memory:poormem dd if=/dev/zero of=test bs=1M count=1000
Killed
当写入1G的数据时,进程是被拒绝的
(5)实验完毕后,可以卸载掉tmpfs
# umount /mnt/tmpfs/
四.freezer冷冻进程管理
1.# vim /etc/cgconfig.conf
group stopit{
freezer{
}
}
# /etc/init.d/cgconfig restart
2.ps ax
1480 pts/0 S+ 0:00 top
3.将top添加到freezer的任务列表里
# echo 1480 > /cgroup/freezer/stopit/tasks
4.冷冻top进程
# echo FROZEN > /cgroup/freezer/stopit/freezer.state
进行刷新操作top命令无反应
5.解冻top进程
# echo THAWED > /cgroup/freezer/stopit/freezer.state