Cgroups控制cpu,記憶體,io示例
百度私有PaaS雲就是使用輕量的cgoups做的應用之間的隔離,以下是關於百度架構師許立強,對於虛擬機器VM,應用沙盒,cgroups技術選型的理解
本文用指令碼執行示例程式,來驗證Cgroups關於cpu、記憶體、io這三部分的隔離效果。
測試機器:CentOS release 6.4 (Final)
啟動Cgroups
service cgconfig start #開啟cgroups服務 chkconfig cgconfig on #開啟啟動
在/cgroup,有如下資料夾,預設是多掛載點的形式,即各個子系統的配置在不同的子資料夾下
[root@localhost /]# ls /cgroup/ blkio cpu cpuacct cpuset devices freezer memory net_cls
cgroups管理程式cpu資源
跑一個耗cpu的指令碼
x=0 while [ True ];do x=$x+1 done;
top可以看到這個指令碼基本佔了100%的cpu資源
root 104m R :
下面用cgroups控制這個程式的cpu資源
mkdir -p /cgroup/cpu/foo/ #新建一個控制組foo echo 50000 > /cgroup/cpu/foo/cpu.cfs_quota_us #將cpu.cfs_quota_us設為50000,相對於cpu.cfs_period_us的100000是50% echo 30142 > /cgroup/cpu/foo/tasks
然後top的實時統計資料如下,cpu佔用率將近50%,看來cgroups關於cpu的控制起了效果
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 30142 root 20 0 105m 2884 1024 R 49.4 0.2 23:32.53 sh
cpu控制組foo下面還有其他的控制,還可以做更多其他的關於cpu的控制
[root@localhost ~]# ls /cgroup/cpu/foo/ cgroup.event_control cgroup.procs cpu.cfs_period_us cpu.cfs_quota_us cpu.rt_period_us cpu.rt_runtime_us cpu.shares cpu.stat notify_on_release tasks
cgroups管理程式記憶體資源
跑一個耗記憶體的指令碼,記憶體不斷增長
x="a" while [ True ];do x=$x$x done;
top看記憶體佔用穩步上升
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 30215 root 20 0 871m 501m 1036 R 99.8 26.7 0:38.69 sh 30215 root 20 0 1639m 721m 1036 R 98.7 38.4 1:03.99 sh 30215 root 20 0 1639m 929m 1036 R 98.6 49.5 1:13.73 sh
下面用cgroups控制這個程式的記憶體資源
mkdir -p /cgroup/memory/foo echo 1048576 > /cgroup/memory/foo/memory.limit_in_bytes #分配1MB的記憶體給這個控制組 echo 30215 > /cgroup/memory/foo/tasks
發現之前的指令碼被kill掉
[root@localhost ~]# sh /home/test.sh 已殺死
因為這是強硬的限制記憶體,當程式試圖佔用的記憶體超過了cgroups的限制,會觸發out of memory,導致程式被kill掉。
實際情況中對程式的記憶體使用會有一個預估,然後會給這個程式的限制超配50%比如,除非發生記憶體洩露等異常情況,才會因為cgroups的限制被kill掉。
也可以通過配置關掉cgroups oom kill程式,通過memory.oom_control來實現(oom_kill_disable 1),但是儘管程式不會被直接殺死,但程式也進入了休眠狀態,無法繼續執行,仍讓無法服務。
關於記憶體的控制,還有以下配置檔案,關於虛擬記憶體的控制,以及權值比重式的記憶體控制等
1
2
3
4
5
6
7
|
[root@localhost /] # ls /cgroup/memory/foo/
cgroup.event_control memory.force_empty memory.memsw.failcnt memory.memsw.usage_in_bytes memory.soft_limit_in_bytes memory.usage_in_bytes tasks cgroup.procs memory.limit_in_bytes memory.memsw.limit_in_bytes memory.move_charge_at_immigrate memory.stat memory.use_hierarchy memory.failcnt memory.max_usage_in_bytes memory.memsw.max_usage_in_bytes memory.oom_control memory.swappiness notify_on_release |
cgroups管理程式io資源
跑一個耗io的指令碼
dd if=/dev/sda of=/dev/null &
通過iotop看io佔用情況,磁碟速度到了284M/s
30252 be/4 root 284.71 M/s 0.00 B/s 0.00 % 0.00 % dd if=/dev/sda of=/dev/null
下面用cgroups控制這個程式的io資源
mkdir -p /cgroup/blkio/foo echo '8:0 1048576' > /cgroup/blkio/foo/blkio.throttle.read_bps_device #8:0對應主裝置號和副裝置號,可以通過ls -l /dev/sda檢視 echo 30252 > /cgroup/blkio/foo/tasks
再通過iotop看,確實將讀速度降到了1M/s
30252 be/4 root 993.36 K/s 0.00 B/s 0.00 % 0.00 % dd if=/dev/sda of=/dev/null
對於io還有很多其他可以控制層面和方式,如下
1
2
3
4
5
6
7
|
[root@localhost ~] # ls /cgroup/blkio/foo/
blkio.io_merged blkio.io_serviced blkio.reset_stats blkio.throttle.io_serviced blkio.throttle.write_bps_device blkio.weight cgroup.procs blkio.io_queued blkio.io_service_time blkio.sectors blkio.throttle.read_bps_device blkio.throttle.write_iops_device blkio.weight_device notify_on_release blkio.io_service_bytes blkio.io_wait_time blkio.throttle.io_service_bytes blkio.throttle.read_iops_device blkio. time cgroup.event_control tasks
|
本文轉自 326647452 51CTO部落格,原文連結:http://blog.51cto.com/svsky/2082896,如需轉載請自行聯絡原作者
相關文章
- docker的資源控制(CPU、記憶體、IO)Docker記憶體
- 效能調優(cpu/IO/JVM記憶體分析)JVM記憶體
- CPU、記憶體、磁碟IO之間的關係記憶體
- 如何使用 Docker 來限制 CPU、記憶體和 IO等資源?Docker記憶體
- 記憶體與IO,磁碟IO,網路IO記憶體
- 統計和分析系統效能【IO CPU 記憶體】的工具集合記憶體
- CPU快取記憶體快取記憶體
- 記憶體CPU監控記憶體
- Oracle 12c系列(四)|資源隔離之IO、記憶體、CPUOracle記憶體
- io記憶體,io埠,彙編 in out 指令記憶體
- 談談CPU快取記憶體快取記憶體
- CPU快取和記憶體屏障快取記憶體
- SUSE檢視CPU和記憶體記憶體
- RMAN的IO記憶體緩衝區記憶體
- CPU和記憶體如何互動的記憶體
- 微服務體系-docker容器cpu記憶體管理微服務Docker記憶體
- 多核cpu、cpu快取記憶體、快取一致性協議、快取行、記憶體快取記憶體協議
- 高併發、低延遲之玩轉CPU快取記憶體(附C#示例)快取記憶體C#
- KVM之十一:調整cpu和記憶體記憶體
- linux檢視cpu、記憶體、版本資訊Linux記憶體
- 檢視程式cpu和記憶體佔用率記憶體
- Linux下檢視記憶體,CPU資訊Linux記憶體
- linux aix檢視CPU和記憶體LinuxAI記憶體
- [Virtualization]ESXi體系結構與記憶體管理(二)控制記憶體分配記憶體
- [Virtualization]ESXi體系結構與記憶體管理(三)控制記憶體分配記憶體
- 控制C++的記憶體分配C++記憶體
- 在Docker中,如何控制容器佔用系統資源(CPU,記憶體)的份額?Docker記憶體
- cpu —>記憶體—>硬碟這種方式是不是更慢?記憶體硬碟
- linux下檢視CPU、記憶體、硬碟方法Linux記憶體硬碟
- 【AIX 學習】記憶體和CPU消耗程式排序AI記憶體排序
- aix 檢視記憶體_cpu_序列號碼AI記憶體
- Docker之CPU和記憶體磁碟設定(八)Docker記憶體
- [譯] Swift:通過示例避免記憶體洩漏Swift記憶體
- 7 個測量 Python 指令碼和控制記憶體以及 CPU 使用率的技巧Python指令碼記憶體
- 記憶體壓力及IO壓力調整方法記憶體
- CPU瞞著記憶體竟幹出這種事記憶體
- 記憶體屏障在CPU、JVM、JDK中的實現記憶體JVMJDK
- Linux檢視CPU和記憶體使用情況Linux記憶體