博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用cgroups来控制内存使用
阅读量:5752 次
发布时间:2019-06-18

本文共 9019 字,大约阅读时间需要 30 分钟。

首先学习网上例子,进行体验性的试验:

首先不限制内存使用来进行下载:

[root@cent6 Desktop]# free -m             total       used       free     shared    buffers     cachedMem:          2006        484       1522          0         29        175-/+ buffers/cache:        279       1727Swap:         4031          0       4031[root@cent6 Desktop]#

然后,再下载约700M:

wget 

然后看内存使用情况:

[root@cent6 Desktop]# free -m             total       used       free     shared    buffers     cachedMem:          2006       1224        782          0         33        878-/+ buffers/cache:        312       1694Swap:         4031          0       4031[root@cent6 Desktop]#

确实是用掉了700多M内存。

 

然后,重新启动,限制内存使用:

[root@cent6 Desktop]# service cgconfig statusStopped#mount -t cgroup -o memory memcg /cgroup # mkdir /cgroup/GroupA  # echo 10M > /cgroup/GroupA/memory.limit_in_bytes  # echo $$ > /cgroup/GroupA/tasks

然后,再看内存状况:

[root@cent6 Desktop]# free -m             total       used       free     shared    buffers     cachedMem:          2006        481       1525          0         29        174-/+ buffers/cache:        276       1729Swap:         4031          0       4031[root@cent6 Desktop]#

再下载约700M:

wget 

再看内存使用前后对比:

[root@cent6 Desktop]# free -m             total       used       free     shared    buffers     cachedMem:          2006        512       1494          0         32        186-/+ buffers/cache:        293       1713Swap:         4031          0       4031[root@cent6 Desktop]#

可以知道,大约的内存使用量为 1525-1494=31M。不过free命令观察到的结果是有误差的,程序执行时间长,free就是一个不断累减的值,由于当前shell被限制使用内存最大10M,那么基数很小的情况下,时间越长,误差越大。

下面,看看对PostgreSQL能否产生良好的限制:

再此之前,通过系统设定来看看对postgres用户进行wget操作时的内存的控制:

[postgres@cent6 Desktop]$ cat /etc/cgconfig.conf##  Copyright IBM Corporation. 2007##  Authors:    Balbir Singh 
# This program is free software; you can redistribute it and/or modify it# under the terms of version 2.1 of the GNU Lesser General Public License# as published by the Free Software Foundation.## This program is distributed in the hope that it would be useful, but# WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.## See man cgconfig.conf for further details.## By default, mount all controllers to /cgroup/
mount { 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;}group test1 { perm { task{ uid=postgres; gid=postgres; } admin{ uid=root; gid=root; } } memory { memory.limit_in_bytes=30M; }}[postgres@cent6 Desktop]$

还有一个文件,cgrules.conf,也很重要:

[postgres@cent6 Desktop]$ cat /etc/cgrules.conf# /etc/cgrules.conf##Each line describes a rule for a user in the forms:##
#
:
##Where:#
can be:# - an user name# - a group name, with @group syntax# - the wildcard *, for any user or group.# - The %, which is equivalent to "ditto". This is useful for# multiline rules where different cgroups need to be specified# for various hierarchies for a single user.##
is optional and it can be:# - a process name# - a full command path of a process##
can be:# - comma separated controller names (no spaces)# - * (for all mounted controllers)##
can be:# - path with-in the controller hierarchy (ex. pgrp1/gid1/uid1)## Note:# - It currently has rules based on uids, gids and process name.## - Don't put overlapping rules. First rule which matches the criteria# will be executed.## - Multiline rules can be specified for specifying different cgroups# for multiple hierarchies. In the example below, user "peter" has# specified 2 line rule. First line says put peter's task in test1/# dir for "cpu" controller and second line says put peter's tasks in# test2/ dir for memory controller. Make a note of "%" sign in second line.# This is an indication that it is continuation of previous rule.###
##john cpu usergroup/faculty/john/#john:cp cpu usergroup/faculty/john/cp#@student cpu,memory usergroup/student/#peter cpu test1/#% memory test2/#@root * admingroup/#* * default/# End of file postgres memory test1/#[postgres@cent6 Desktop]$

在root用户,设置如下两个服务随系统启动:

chkconfig cgconfig  on

chkconfig cgred on

然后重新启动系统后,用postgres用户进行登录,进行检验:

[postgres@cent6 Desktop]$ free -m             total       used       free     shared    buffers     cachedMem:          2006        381       1625          0         25        134-/+ buffers/cache:        221       1785
[postgres@cent6 Desktop]$ wget http://centos.arcticnetwork.ca/6.4/isos/x86_64/CentOS-6.4-x86_64-LiveCD.iso

执行完毕后,看内存状况,成功。

[postgres@cent6 Desktop]$ free -m             total       used       free     shared    buffers     cachedMem:          2006        393       1613          0         28        141-/+ buffers/cache:        224       1782Swap:         4031         67       3964[postgres@cent6 Desktop]$

 

下面看对postgresql中执行sql 的限制如何:

 

步骤1:   对/etc/cgconfig.conf 文件和 /etc/cgrules.conf 文件的设置如前所述。

 

步骤2:   运行前查看内存状况:

 

[postgres@cent6 Desktop]$ free -m
             total       used       free     shared    buffers     cached
Mem:          2006        384       1622          0         26        138
-/+ buffers/cache:        219       1787
Swap:         4031         87       3944
[postgres@cent6 Desktop]$ 

 

步骤3: 开始处理大量数据(约600MB)

 

postgres=# select count(*) from test01; count -------     0(1 row) postgres=# insert into test01 values(generate_series(1,614400),repeat( chr(int4(random()*26)+65),1024));

运行刚刚开始,就出现了如下的错误: 

The connection to the server was lost. Attempting reset: Failed.!>

这和之前碰到的崩溃情形一致。

 
PostgreSQL的log本身是这样的:
 
[postgres@cent6 pgsql]$ LOG:  database system was shut down at 2013-09-09 16:20:29 CSTLOG:  database system is ready to accept connectionsLOG:  autovacuum launcher startedLOG:  server process (PID 2697) was terminated by signal 9: KilledDETAIL:  Failed process was running: insert into test01 values(generate_series(1,614400),repeat( chr(int4(random()*26)+65),1024));LOG:  terminating any other active server processesWARNING:  terminating connection because of crash of another server processDETAIL:  The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.HINT:  In a moment you should be able to reconnect to the database and repeat your command.FATAL:  the database system is in recovery modeLOG:  all server processes terminated; reinitializingLOG:  database system was interrupted; last known up at 2013-09-09 17:35:42 CSTLOG:  database system was not properly shut down; automatic recovery in progressLOG:  redo starts at 1/9E807C90LOG:  unexpected pageaddr 1/946BE000 in log file 1, segment 159, offset 7069696LOG:  redo done at 1/9F6BDB50LOG:  database system is ready to accept connectionsLOG:  autovacuum launcher started

通过dmesg命令,可以看到,发生了Out of Memory错误,这次是 cgroup out of memory

 

[postgres@cent6 Desktop]$ dmesg | grep post[ 2673]   500  2673    64453      200   0       0             0 postgres[ 2675]   500  2675    64494       79   0       0             0 postgres[ 2676]   500  2676    64453       75   0       0             0 postgres[ 2677]   500  2677    64453       77   0       0             0 postgres[ 2678]   500  2678    64667       80   0       0             0 postgres[ 2679]   500  2679    28359       72   0       0             0 postgres[ 2697]   500  2697    64764      100   0       0             0 postgres[ 2673]   500  2673    64453      200   0       0             0 postgres[ 2675]   500  2675    64494       79   0       0             0 postgres[ 2676]   500  2676    64453       75   0       0             0 postgres[ 2677]   500  2677    64453       77   0       0             0 postgres[ 2678]   500  2678    64667       80   0       0             0 postgres[ 2679]   500  2679    28359       72   0       0             0 postgres[ 2697]   500  2697    64764      100   0       0             0 postgres[ 2673]   500  2673    64453      208   0       0             0 postgres[ 2675]   500  2675    64494       79   0       0             0 postgres[ 2676]   500  2676    64453       98   0       0             0 postgres[ 2677]   500  2677    64453      782   0       0             0 postgres[ 2678]   500  2678    64667      133   0       0             0 postgres[ 2679]   500  2679    28359       86   0       0             0 postgres[ 2697]   500  2697    73075     3036   0       0             0 postgresMemory cgroup out of memory: Kill process 2697 (postgres) score 1000 or sacrifice childKilled process 2697, UID 500, (postgres) total-vm:292300kB, anon-rss:8432kB, file-rss:3712kB[postgres@cent6 Desktop]$

 

我怀疑自己的内存开得过小了,影响到一些基本的运行。PostgreSQL本身也需要一些资源(shared_buffers、wal_buffers都需要用一些内存)

  

所以我调整了参数   memory.limit_in_bytes=300M ,再次运行:

前述的sql问处理1200MB数据,成功结束,内存没有过多增长。

 

本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/p/3305551.html,如需转载请自行联系原作者

你可能感兴趣的文章
数据透视表同时分组周、月、年
查看>>
wcf学习总结《中》
查看>>
CentOS7 iso封装语句
查看>>
/usr/bin/which: no ssh-copy-id in 和ssh: Could not resolve hostname
查看>>
nagios批量创建主机脚本
查看>>
问题诊断:为什么点击淘宝评价详情无法显示内容?
查看>>
三种网线的RJ-45接头制作法图解
查看>>
CentOS6.6安装Oracle 11.2g
查看>>
构建企业服务之部署Windows Server 2008域控制器
查看>>
Exchange2010-Activesync之远程擦除手机终端(Exchange mail)
查看>>
3.find through association
查看>>
学习批处理的心得
查看>>
Flex的动画效果与变换!(一)
查看>>
用Weblogic遇到的问题笔记
查看>>
升级cisco设备的IOS
查看>>
FTP服务器配置与管理(4) 服务器端的常用配置及FTP命令
查看>>
取消远程桌面连接时打印机重定向引发的报错
查看>>
【强化学习炼金术】李飞飞高徒范麟熙解析强化学习在游戏和现实中的应用
查看>>
如何杀掉D状态的进程?[zt]【转】
查看>>
深入浅出 Javascript API(五)--Query & Find 查询
查看>>