cgroup限制进程内存大小,cgroup进程内存大小


以限制mongodb的内存大小为例。

Cgroup限制方法:  

mkdir /cgroup/memory/test/  
echo 50M > /cgroup/memory/test/memory.limit_in_bytes  
echo 50M > /cgroup/memory/test/memory.memsw.limit_in_bytes  
cgexec -g memory:test mongod -port 27017 --bind_ip 127.0.0.1 --dbpath /var/lib/mongo  

通过cgroup限制后,当内存达到限额,进程会被kill。

 
[root@centos mongo]# cgexec -g memory:test mongod -port 27017 --bind_ip 127.0.0.1 --dbpath /var/lib/mongo  
2014-07-18T23:20:53.228+0800 [initandlisten] MongoDB starting : pid=2529 port=27017 dbpath=/var/lib/mongo 64-bit host=centos  
2014-07-18T23:20:53.228+0800 [initandlisten] db version v2.6.3  
2014-07-18T23:20:53.228+0800 [initandlisten] git version: 255f67a66f9603c59380b2a389e386910bbb52cb  
2014-07-18T23:20:53.228+0800 [initandlisten] build info: Linux build12.nj1.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49  
2014-07-18T23:20:53.228+0800 [initandlisten] allocator: tcmalloc  
2014-07-18T23:20:53.228+0800 [initandlisten] options: { net: { bindIp: "127.0.0.1", port: 27017 }, storage: { dbPath: "/var/lib/mongo" } }  
2014-07-18T23:20:53.304+0800 [initandlisten] journal dir=/var/lib/mongo/journal  
2014-07-18T23:20:53.304+0800 [initandlisten] recover : no journal files present, no recovery needed  
2014-07-18T23:20:53.374+0800 [initandlisten] waiting for connections on port 27017  
2014-07-18T23:20:57.838+0800 [initandlisten] connection accepted from 127.0.0.1:36712 #1 (1 connection now open)  
2014-07-18T23:21:15.077+0800 [initandlisten] connection accepted from 127.0.0.1:36713 #2 (2 connections now open)  
2014-07-18T23:21:52.342+0800 [conn2] getmore test.my_collection cursorid:34538199491 ntoreturn:0 keyUpdates:0 numYields:39 locks(micros) r:121572 nreturned:95052 reslen:4194299 202ms  
2014-07-18T23:21:53.376+0800 [clientcursormon] mem (MB) res:136 virt:12809  
2014-07-18T23:21:53.376+0800 [clientcursormon]  mapped (incl journal view):12508  
2014-07-18T23:21:53.376+0800 [clientcursormon]  connections:2  
2014-07-18T23:21:56.790+0800 [conn2] getmore test.my_collection cursorid:34538199491 ntoreturn:0 keyUpdates:0 numYields:88 locks(micros) r:142113 nreturned:95595 reslen:4194301 244ms  
Killed  

数据查询脚本:

[root@centos data]# cat mongotestList.py  
import pymongo  
import time  
 
client = pymongo.MongoClient("localhost", 27017)  
db = client.test  
print db.name  
print db.my_collection  

for item in db.my_collection.find():  
    print item  

数据插入脚本:

[root@centos data]# cat mongotest2.py  
import pymongo  
import time  

client = pymongo.MongoClient("localhost", 27017)  
db = client.test  
print db.name  
print db.my_collection  

while True:  
    db.my_collection.save({time.ctime(): time.time()}) 



怎查看linux每个进程的内存大小限制

我不知道如何查看。但记得Linux(32位)中每个进程独享4GB的进程空间,需要注意的是这4G指的是虚拟内存,而非物理内存。可以查阅一下Linux虚拟内存机制相关资料。

要定制的话难度大啊!内核文件里用进程描述符(thread_info)表示一个进程,它是一个结构体,里面有个关于进程内存分配的字段(addr_limit)。具体自己研究研究吧!

如果只是对某个进程分配空间的话就简单多了。假如你要为当前进程设置2M的内存上限,可以通过current->addr_limit=2048实现。
 

linux cgroup(control groups) kill 进程会关socket?

如果程序退出,进程的socket会关闭的
 

相关内容