আমার অ্যাপ্লিকেশনটির জন্য, জাভা প্রক্রিয়া দ্বারা ব্যবহৃত মেমরিটি হিপ আকারের চেয়ে অনেক বেশি।
যে পাত্রে চালিত হয় সেই সিস্টেমে মেমরির সমস্যা হতে শুরু করে কারণ ধারকটি গাদা আকারের চেয়ে অনেক বেশি মেমরি নিয়েছে।
গাদা আকারটি 128 এমবি ( -Xmx128m -Xms128m
) তে সেট করা থাকে যখন ধারকটি 1 গিগাবাইট পর্যন্ত মেমরি নেয়। স্বাভাবিক অবস্থায় এটির 500MB দরকার। ডকারের ধারকটির নীচে সীমাবদ্ধতা থাকলে (উদাহরণস্বরূপ mem_limit=mem_limit=400MB
) ওএসের মেমরি কিলারের বাইরে প্রক্রিয়াটি মারা যায়।
আপনি কী ব্যাখ্যা করতে পারেন যে জাভা প্রক্রিয়া কেন গাদা চেয়ে অনেক বেশি মেমরি ব্যবহার করছে? ডকার মেমরি সীমাটি কীভাবে সঠিকভাবে আকার করতে হবে? জাভা প্রক্রিয়াটির অফ অফ হিপ মেমরির পদক্ষেপ হ্রাস করার কোনও উপায় আছে কি?
আমি জেভিএম-এ নেটিভ মেমরি ট্র্যাকিংয়ের কমান্ড ব্যবহার করে সমস্যাটি সম্পর্কে কিছু বিশদ সংগ্রহ করি ।
হোস্ট সিস্টেম থেকে, আমি ধারকটির দ্বারা ব্যবহৃত স্মৃতি পেয়েছি।
$ docker stats --no-stream 9afcb62a26c8
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9afcb62a26c8 xx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.0acbb46bb6fe3ae1b1c99aff3a6073bb7b7ecf85 0.93% 461MiB / 9.744GiB 4.62% 286MB / 7.92MB 157MB / 2.66GB 57
ধারকটির ভিতরে থেকে, আমি প্রক্রিয়াটির দ্বারা ব্যবহৃত স্মৃতি পেয়েছি।
$ ps -p 71 -o pcpu,rss,size,vsize
%CPU RSS SIZE VSZ
11.2 486040 580860 3814600
$ jcmd 71 VM.native_memory
71:
Native Memory Tracking:
Total: reserved=1631932KB, committed=367400KB
- Java Heap (reserved=131072KB, committed=131072KB)
(mmap: reserved=131072KB, committed=131072KB)
- Class (reserved=1120142KB, committed=79830KB)
(classes #15267)
( instance classes #14230, array classes #1037)
(malloc=1934KB #32977)
(mmap: reserved=1118208KB, committed=77896KB)
( Metadata: )
( reserved=69632KB, committed=68272KB)
( used=66725KB)
( free=1547KB)
( waste=0KB =0.00%)
( Class space:)
( reserved=1048576KB, committed=9624KB)
( used=8939KB)
( free=685KB)
( waste=0KB =0.00%)
- Thread (reserved=24786KB, committed=5294KB)
(thread #56)
(stack: reserved=24500KB, committed=5008KB)
(malloc=198KB #293)
(arena=88KB #110)
- Code (reserved=250635KB, committed=45907KB)
(malloc=2947KB #13459)
(mmap: reserved=247688KB, committed=42960KB)
- GC (reserved=48091KB, committed=48091KB)
(malloc=10439KB #18634)
(mmap: reserved=37652KB, committed=37652KB)
- Compiler (reserved=358KB, committed=358KB)
(malloc=249KB #1450)
(arena=109KB #5)
- Internal (reserved=1165KB, committed=1165KB)
(malloc=1125KB #3363)
(mmap: reserved=40KB, committed=40KB)
- Other (reserved=16696KB, committed=16696KB)
(malloc=16696KB #35)
- Symbol (reserved=15277KB, committed=15277KB)
(malloc=13543KB #180850)
(arena=1734KB #1)
- Native Memory Tracking (reserved=4436KB, committed=4436KB)
(malloc=378KB #5359)
(tracking overhead=4058KB)
- Shared class space (reserved=17144KB, committed=17144KB)
(mmap: reserved=17144KB, committed=17144KB)
- Arena Chunk (reserved=1850KB, committed=1850KB)
(malloc=1850KB)
- Logging (reserved=4KB, committed=4KB)
(malloc=4KB #179)
- Arguments (reserved=19KB, committed=19KB)
(malloc=19KB #512)
- Module (reserved=258KB, committed=258KB)
(malloc=258KB #2356)
$ cat /proc/71/smaps | grep Rss | cut -d: -f2 | tr -d " " | cut -f1 -dk | sort -n | awk '{ sum += $1 } END { print sum }'
491080
অ্যাপ্লিকেশনটি হ'ল জেটি / জার্সি / সিডিআই ব্যবহার করে এমন একটি ওয়েব সার্ভার যা 36 মেগাবাইটের মধ্যে একটি ফ্যাটের অভ্যন্তরে বান্ডিল রয়েছে।
ওএস এবং জাভা এর নিম্নলিখিত সংস্করণ ব্যবহার করা হয় (ধারক ভিতরে)। ডকার চিত্রটি ভিত্তিক openjdk:11-jre-slim
।
$ java -version
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment (build 11+28-Debian-1)
OpenJDK 64-Bit Server VM (build 11+28-Debian-1, mixed mode, sharing)
$ uname -a
Linux service1 4.9.125-linuxkit #1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 GNU/Linux
https://gist.github.com/prasanthj/48e7063cac88eb396bc9961fb3149b58
cgroups
ব্যবহৃত মেমরিতে ডিস্ক-ক্যাশে যুক্ত করে - এমনকি এটি কার্নেল দ্বারা পরিচালিত হলেও এটি ব্যবহারকারীর প্রোগ্রামের জন্য অদৃশ্য। (আপনার কথা মনে করুন, আদেশ দিন ps
এবং docker stats
ডিস্ক-ক্যাশে গণনা করবেন না))