2013-11-20 9 views
32

ubuntu 13,04सीमा स्मृति

[email protected]:~# docker version 
Client version: 0.6.6 
Go version (client): go1.2rc3 
Git commit (client): 6d42040 
Server version: 0.6.6 
Git commit (server): 6d42040 
Go version (server): go1.2rc3 
Last stable version: 0.6.6 

के शीर्ष पर डोकर के पिछले संस्करण चल रहा है लेकिन जब मैं कंटेनर शुरू

[email protected]:~# docker run -m=1524288 -i -t ubuntu /bin/bash 
[email protected]:/# free -m 
      total  used  free  shared buffers  cached 
Mem:   1992  608  1383   0   30  341 
-/+ buffers/cache:  237  1755 
Swap:   2047   0  2047 

मैं किसी भी सीमित नहीं दिख रहा है काम नहीं करता है किसी भी तरह से, और मेरे कर्नेल में cgroups मेमोरी सीमा सक्षम है:

kernel /boot/vmlinuz-3.8.0-33-generic ro console=tty0 root=/dev/xvda1 cgroup_enable=memory swapaccount=1 

मुझे यहां क्या स्पष्ट चीज़ याद आ रही है?

+0

एक इसके लिए अनुवर्ती, मैं वर्चुअलाइज्ड सर्वर पर डॉकराइज्ड ऐप्स के बीच कुछ रोचक अंतर देख रहा हूं, जिसमें नंगे-धातु बॉक्स हैं। उदाहरण के लिए, ओओएम जावास्क्रिप्ट को वर्चुअलाइज्ड यूबंटू सर्वर में कंटेनर में जावा सेवा चलाएगा। हालांकि, धातु पर - जावा डॉकर के माध्यम से सेट मेमोरी सीमा का सम्मान कर रहा है। [मुझे अभी तक अच्छे निष्कर्षों के लिए दोनों के बीच कार्यान्वयन विवरण के बारे में पर्याप्त जानकारी नहीं है, बस साझा करना चाहता था] – nerdwaller

उत्तर

42

free इसे नहीं दिखाएगा क्योंकि यह cgroups के माध्यम से लागू किया गया है।

: जैसे - इसके बजाय (कंटेनर के बाहर) मेजबान आप /sysfs का उपयोग कर जांच कर सकते हैं और cgroup स्मृति पर

[email protected]:~$ docker run -m=524288 -d -t busybox sleep 3600 
f03a017b174f 
[email protected]:~$ cat /sys/fs/cgroup/memory/lxc/f03a017b174ff1022e0f46bc1b307658c2d96ffef1dd97e7c1929a4ca61ab80f//memory.limit_in_bytes 
524288 

यह स्मृति से बाहर चलाने के आप कुछ है कि अधिक स्मृति का उपयोग करेगा की तुलना में आप आवंटित चला सकते हैं देखने के लिए

docker run -m=524288 -d -p 8000:8000 -t ubuntu:12.10 /usr/bin/python3 -m http.server 
8480df1d2d5d 
[email protected]:~$ docker ps | grep 0f742445f839 
[email protected]:~$ docker ps -a | grep 0f742445f839 
0f742445f839  ubuntu:12.10  /usr/bin/python3 -m 16 seconds ago  Exit 137        blue_pig 

dmesg में आप कंटेनर और इस प्रक्रिया को मार डाला देखना चाहिए:

[ 583.447974] Pid: 1954, comm: python3 Tainted: GF   O 3.8.0-33-generiC#48~precise1-Ubuntu 
[ 583.447980] Call Trace: 
[ 583.447998] [<ffffffff816df13a>] dump_header+0x83/0xbb 
[ 583.448108] [<ffffffff816df1c7>] oom_kill_process.part.6+0x55/0x2cf 
[ 583.448124] [<ffffffff81067265>] ? has_ns_capability_noaudit+0x15/0x20 
[ 583.448137] [<ffffffff81191cc1>] ? mem_cgroup_iter+0x1b1/0x200 
[ 583.448150] [<ffffffff8113893d>] oom_kill_process+0x4d/0x50 
[ 583.448171] [<ffffffff816e1cf5>] mem_cgroup_out_of_memory+0x1f6/0x241 
[ 583.448187] [<ffffffff816e1e7f>] mem_cgroup_handle_oom+0x13f/0x24a 
[ 583.448200] [<ffffffff8119000d>] ? mem_cgroup_margin+0xad/0xb0 
[ 583.448212] [<ffffffff811949d0>] ? mem_cgroup_charge_common+0xa0/0xa0 
[ 583.448224] [<ffffffff81193ff3>] mem_cgroup_do_charge+0x143/0x170 
[ 583.448236] [<ffffffff81194125>] __mem_cgroup_try_charge+0x105/0x350 
[ 583.448249] [<ffffffff81194987>] mem_cgroup_charge_common+0x57/0xa0 
[ 583.448261] [<ffffffff8119517a>] mem_cgroup_newpage_charge+0x2a/0x30 
[ 583.448275] [<ffffffff8115b4d3>] do_anonymous_page.isra.35+0xa3/0x2f0 
[ 583.448288] [<ffffffff8115f759>] handle_pte_fault+0x209/0x230 
[ 583.448301] [<ffffffff81160bb0>] handle_mm_fault+0x2a0/0x3e0 
[ 583.448320] [<ffffffff816f844f>] __do_page_fault+0x1af/0x560 
[ 583.448341] [<ffffffffa02b0a80>] ? vfsub_read_u+0x30/0x40 [aufs] 
[ 583.448358] [<ffffffffa02ba3a7>] ? aufs_read+0x107/0x140 [aufs] 
[ 583.448371] [<ffffffff8119bb50>] ? vfs_read+0xb0/0x180 
[ 583.448384] [<ffffffff816f880e>] do_page_fault+0xe/0x10 
[ 583.448396] [<ffffffff816f4bd8>] page_fault+0x28/0x30 
[ 583.448405] Task in /lxc/0f742445f8397ee7928c56bcd5c05ac29dcc6747c6d1c3bdda80d8e688fae949 killed as a result of limit of /lxc/0f742445f8397ee7928c56bcd5c05ac29dcc6747c6d1c3bdda80d8e688fae949 
[ 583.448412] memory: usage 416kB, limit 512kB, failcnt 342 
+0

धन्यवाद अब मैं समझता हूं; इसलिए वर्तमान उपयोग देखने के लिए cgroup मेमोरी को जांचना सबसे अच्छा तरीका है। – Disco

+0

आप यहां 'cgroup' मेमोरी मीट्रिक के बारे में अधिक पढ़ सकते हैं http://blog.docker.io/2013/10/gathering-lxc-docker-containers-metrics/ विशेष रूप से' memory.stat' छद्म फ़ाइल । –

+0

बहुत धन्यवाद। Ubuntu https://github.com/dotcloud/docker/issues/4250 – Barry

20

stressin पर इस nice post से लिंक करना जी कंटेनर स्मृति उपयोग।

$ sudo docker -m 512M -it ubuntu /bin/bash 
root# apt-get update && apt-get install -y build-essential 

निम्नलिखित

#include <stdlib.h> 
#include <stdio.h> 

int main(void) { 
    int i; 
    for (i=0; i<65536; i++) { 
     char *q = malloc(65536); 
     printf ("Malloced: %ld\n", 65536*i); 
    } 
    sleep(9999999); 
} 
साथ कंटेनर के अंदर एक फ़ाइल foo.c बनाएं: एक स्मृति सीमा के साथ

लॉन्च कंटेनर: यहाँ सारांश है, सामान्य LXC के बजाय डोकर के लिए काम करने के लिए एक सा संशोधित

फ़ाइल संकलित करें

gcc -o foo foo.c 

एक नया टेर खोलें मीनल कंटेनर स्मृति के उपयोग पर नजर रखने के:

$ cd /sys/fs/cgroup/memory/lxc/{{containerID}} 
$ while true; do echo -n "Mem Usage (mb): " && expr `cat memory.usage_in_bytes`/1024/1024; echo -n "Mem+swap Usage (mb): " && expr `cat memory.limit_in_bytes`/1024/1024; sleep 1; done 

कंटेनर

$ ./foo 

में स्मृति की खपत शुरू अब अपने कंटेनर अधिकतम देखना। नोट: जब आप स्मृति malloc की विफल होने की शुरुआत से बाहर होते हैं, लेकिन अन्यथा कंटेनर अकेला छोड़ दिया जाता है। आम तौर पर कंटेनर के अंदर सॉफ़्टवेयर असफल मैलॉक्स के कारण क्रैश हो जाएगा, लेकिन लचीला सॉफ़्टवेयर

अंतिम नोट: डॉकर का फ़्लैग स्वैप और रैम को अलग-अलग नहीं मानता है। यदि आप -m 512M का उपयोग करते हैं तो उस 512 में से कुछ स्वैप होंगे, रैम नहीं। आप केवल राम चाहते हैं तो आप सीधे LXC विकल्पों का उपयोग करने की आवश्यकता होगी, तो

# Same as docker -m 512m 
sudo docker run --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash 

# Set total to equal max RAM (e.g. don't use swap) 
sudo docker run --lxc-conf="lxc.cgroup.memory.max_usage_in_bytes=512M" --lxc-conf="lxc.cgroup.memory.limit_in_bytes=512M" -it ubuntu /bin/bash 

के हिस्से के रूप स्वैप का उपयोग कर के बीच एक उल्लेखनीय अंतर नहीं है (यदि आप libcontainer के बजाय LXC निष्पादन ड्राइवर के साथ डोकर चलाने की आवश्यकता होगी, जिसका मतलब है) कुल और नहीं - ऊपर से 450 डिग्री तक पहुंचने वाले फू कार्यक्रम को स्वैप करें और फिर धीरे-धीरे शेष का उपभोग करें, जबकि केवल रैम के साथ यह तुरंत मेरे लिए 511 एम तक पहुंच जाएगा।जैसे ही मैं कंटेनर दर्ज करता हूं, कंटेनर की मेमोरी खपत ~ 60 एम पर स्वैप के साथ चिह्नित की जाती है - यह मूल रूप से स्वैप को "उपयोग" के रूप में गिना जाता है। स्वैप के बिना मेरी स्मृति उपयोग जब मैं कंटेनर

+1

स्पष्ट स्पष्टीकरण के लिए धन्यवाद! – pygabriel

+0

मैं एकत्रित और डॉकर काम करने की कोशिश कर रहा था। हालांकि संग्रहित डॉकर प्रतिबंधित स्मृति के बजाय समग्र सिस्टम (मेजबान) के रैम उपयोग को संग्रहित करता है। http://stackoverflow.com/q/37881322/1925997 मैं सोच रहा था कि यह विकल्प मदद कर सकता है, लेकिन जब '--lxc-conf = "lxc.cgroup.memory.limit_in_bytes = 512M" के साथ डॉकर चला रहा है, "मैं समाप्त कर रहा हूं 'ध्वज प्रदान किया गया लेकिन परिभाषित नहीं किया गया: --lxc-conf' त्रुटि। कोई विचार यह कैसे हल करें? –

+0

ग्रेट उत्तर !, बीटीडब्ल्यू मुझे लगता है कि आप '' 'sudo docker * run * -m 512M -it ubuntu/bin/bash''' के firs उदाहरण पंक्ति में 'रन' cimmand को याद करते हैं – gsalgadotoledo

0

आप डोकर के एक नए संस्करण जगह का उपयोग कर रहे हैं, तो उस जानकारी के लिए देखने के लिए अगर दर्ज < 10M है /sys/fs/cgroup/memory/docker/<container_id>/memory.limit_in_bytes है:

docker run --memory="198m" redis 
docker ps --no-trunc` # to get the container long_id 
313105b341eed869bcc355c4b3903b2ede2606a8f1b7154e64f913113db8b44a 
cat /sys/fs/cgroup/memory/docker/313105b341eed869bcc355c4b3903b2ede2606a8f1b7154e64f913113db8b44a/memory.limit_in_bytes 
207618048 # in bytes 
संबंधित मुद्दे