ذاكرة الموقد مخصصة والتدخل OOM القاتل

مرحبا مرة أخرى! تم إعداد ترجمة المقال التالي خصيصًا لطلاب دورة البنية التحتية لمنصة Kubernetes ، والتي تبدأ هذا الشهر.



في الأيام الأخيرة ، تحطمت بعض القرون باستمرار ، مما ترك سجلاً في سجل نظام التشغيل الذي قام OOM Killer بتدمير عملية الحاوية. قررت أن أعرف لماذا يحدث هذا.

نسمع الحد الذاكرة وإعدادات الذاكرة cgroup


دعونا اختبار على توزيع K3s. نخلق تحت مع حد ذاكرة مميزة من 123 ميجابايت (123 ميل).

kubectl run --restart=Never --rm -it --image=ubuntu --limits='memory=123Mi' -- sh If you don't see a command prompt, try pressing enter. root@sh:/# 

في وحدة تحكم أخرى ، تعرف على uid الموقد.

 kubectl get pods sh -o yaml | grep uid uid: bc001ffa-68fc-11e9-92d7-5ef9efd9374c 

على الخادم الذي يعمل عليه ، cgroup معلمات cgroup خلال تحديد cgroup الخاص cgroup المطلوب.

 cd /sys/fs/cgroup/memory/kubepods/burstable/podbc001ffa-68fc-11e9-92d7-5ef9efd9374c cat memory.limit_in_bytes 128974848 

128974848 هو بالضبط 123 ميجابايت (123 * 1024 * 1024). الوضع هو توضيح. اتضح أنه في Kubernetes ، يتم تعيين حد الذاكرة من خلال cgroup. بمجرد زيادة عدد الذاكرة المخصصة ، يبدأ cgroup بتدمير عملية الحاوية.

اختبار الإجهاد


دعونا تثبيت الأدوات المساعدة لاختبار الإجهاد الموقد من خلال جلسة وحدة تحكم قيادة مفتوحة.

 root@sh:/# apt update; apt install -y stress 

في الوقت نفسه ، سنتعقب إدخالات سجل النظام باستخدام dmesg -Tw .

أولاً ، قم بتشغيل الأداة المساعدة لاختبار الإجهاد ، مع تخصيص 100 ميغابايت في الذاكرة. بدأت العملية بنجاح.

 root@sh:/# stress --vm 1 --vm-bytes 100M & [1] 271 root@sh:/# stress: info: [271] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd 

الآن سنقوم بإجراء اختبار الإجهاد الثاني.

 root@sh:/# stress --vm 1 --vm-bytes 50M stress: info: [273] dispatching hogs: 0 cpu, 0 io, 1 vm, 0 hdd stress: FAIL: [271] (415) <-- worker 272 got signal 9 stress: WARN: [271] (417) now reaping child worker processes stress: FAIL: [271] (451) failed run completed in 7s 

أدى الإطلاق إلى التدمير الفوري لعملية اختبار الإجهاد الأول (PID 271) في الإشارة 9.

وفي الوقت نفسه ، ظهرت الإدخالات التالية في سجل النظام:

[Sat Apr 27 22:56:09 2019] stress invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=939
[Sat Apr 27 22:56:09 2019] stress cpuset=a2ed67c63e828da3849bf9f506ae2b36b4dac5b402a57f2981c9bdc07b23e672 mems_allowed=0
[Sat Apr 27 22:56:09 2019] CPU: 0 PID: 32332 Comm: stress Not tainted 4.15.0-46-generic #49-Ubuntu
[Sat Apr 27 22:56:09 2019] Hardware name: BHYVE, BIOS 1.00 03/14/2014
[Sat Apr 27 22:56:09 2019] Call Trace:
[Sat Apr 27 22:56:09 2019] dump_stack+0x63/0x8b
[Sat Apr 27 22:56:09 2019] dump_header+0x71/0x285
[Sat Apr 27 22:56:09 2019] oom_kill_process+0x220/0x440
[Sat Apr 27 22:56:09 2019] out_of_memory+0x2d1/0x4f0
[Sat Apr 27 22:56:09 2019] mem_cgroup_out_of_memory+0x4b/0x80
[Sat Apr 27 22:56:09 2019] mem_cgroup_oom_synchronize+0x2e8/0x320
[Sat Apr 27 22:56:09 2019] ? mem_cgroup_css_online+0x40/0x40
[Sat Apr 27 22:56:09 2019] pagefault_out_of_memory+0x36/0x7b
[Sat Apr 27 22:56:09 2019] mm_fault_error+0x90/0x180
[Sat Apr 27 22:56:09 2019] __do_page_fault+0x4a5/0x4d0
[Sat Apr 27 22:56:09 2019] do_page_fault+0x2e/0xe0
[Sat Apr 27 22:56:09 2019] ? page_fault+0x2f/0x50
[Sat Apr 27 22:56:09 2019] page_fault+0x45/0x50
[Sat Apr 27 22:56:09 2019] RIP: 0033:0x558182259cf0
[Sat Apr 27 22:56:09 2019] RSP: 002b:00007fff01a47940 EFLAGS: 00010206
[Sat Apr 27 22:56:09 2019] RAX: 00007fdc18cdf010 RBX: 00007fdc1763a010 RCX: 00007fdc1763a010
[Sat Apr 27 22:56:09 2019] RDX: 00000000016a5000 RSI: 0000000003201000 RDI: 0000000000000000
[Sat Apr 27 22:56:09 2019] RBP: 0000000003200000 R08: 00000000ffffffff R09: 0000000000000000
[Sat Apr 27 22:56:09 2019] R10: 0000000000000022 R11: 0000000000000246 R12: ffffffffffffffff
[Sat Apr 27 22:56:09 2019] R13: 0000000000000002 R14: fffffffffffff000 R15: 0000000000001000
[Sat Apr 27 22:56:09 2019] Task in /kubepods/burstable/podbc001ffa-68fc-11e9-92d7-5ef9efd9374c/a2ed67c63e828da3849bf9f506ae2b36b4dac5b402a57f2981c9bdc07b23e672 killed as a result of limit of /kubepods/burstable/podbc001ffa-68fc-11e9-92d7-5ef9efd9374c
[Sat Apr 27 22:56:09 2019] memory: usage 125952kB, limit 125952kB, failcnt 3632
[Sat Apr 27 22:56:09 2019] memory+swap: usage 0kB, limit 9007199254740988kB, failcnt 0
[Sat Apr 27 22:56:09 2019] kmem: usage 2352kB, limit 9007199254740988kB, failcnt 0
[Sat Apr 27 22:56:09 2019] Memory cgroup stats for /kubepods/burstable/podbc001ffa-68fc-11e9-92d7-5ef9efd9374c: cache:0KB rss:0KB rss_huge:0KB shmem:0KB mapped_file:0KB dirty:0KB writeback:0KB inactive_anon:0KB active_anon:0KB inactive_file:0KB active_file:0KB unevictable:0KB
[Sat Apr 27 22:56:09 2019] Memory cgroup stats for /kubepods/burstable/podbc001ffa-68fc-11e9-92d7-5ef9efd9374c/79fae7c2724ea1b19caa343fed8da3ea84bbe5eb370e5af8a6a94a090d9e4ac2: cache:0KB rss:48KB rss_huge:0KB shmem:0KB mapped_file:0KB dirty:0KB writeback:0KB inactive_anon:0KB active_anon:48KB inactive_file:0KB active_file:0KB unevictable:0KB
[Sat Apr 27 22:56:09 2019] Memory cgroup stats for /kubepods/burstable/podbc001ffa-68fc-11e9-92d7-5ef9efd9374c/a2ed67c63e828da3849bf9f506ae2b36b4dac5b402a57f2981c9bdc07b23e672: cache:0KB rss:123552KB rss_huge:0KB shmem:0KB mapped_file:0KB dirty:0KB writeback:0KB inactive_anon:0KB active_anon:123548KB inactive_file:0KB active_file:0KB unevictable:0KB
[Sat Apr 27 22:56:09 2019] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
[Sat Apr 27 22:56:09 2019] [25160] 0 25160 256 1 28672 0 -998 pause
[Sat Apr 27 22:56:09 2019] [25218] 0 25218 4627 872 77824 0 939 bash
[Sat Apr 27 22:56:09 2019] [32307] 0 32307 2060 275 57344 0 939 stress
[Sat Apr 27 22:56:09 2019] [32308] 0 32308 27661 24953 253952 0 939 stress
[Sat Apr 27 22:56:09 2019] [32331] 0 32331 2060 304 53248 0 939 stress
[Sat Apr 27 22:56:09 2019] [32332] 0 32332 14861 5829 102400 0 939 stress
[Sat Apr 27 22:56:09 2019] Memory cgroup out of memory: Kill process 32308 (stress) score 1718 or sacrifice child
[Sat Apr 27 22:56:09 2019] Killed process 32308 (stress) total-vm:110644kB, anon-rss:99620kB, file-rss:192kB, shmem-rss:0kB
[Sat Apr 27 22:56:09 2019] oom_reaper: reaped process 32308 (stress), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB


تم تدمير العملية مع PID 32308 على المضيف بسبب نفاد الذاكرة (OOM). ولكن الشيء الأكثر إثارة للاهتمام مخفي في نهاية إدخالات دفتر اليومية:



فيما يلي عمليات هذا الموقد التي تم تحديدها كمرشحين للتدمير بواسطة مكون OOM Killer. تلقت عملية pause الأساسي ، التي تخزن مساحات أسماء الشبكات ، تصنيف -998 ، مما يعني أن العملية غير مضمونة للتدمير. تلقت العمليات المتبقية في الحاوية درجة oom_score_adj من 939 . يمكنك التحقق من هذه القيمة باستخدام الصيغة من وثائق Kubernetes أدناه:

 min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) 

نكتشف مقدار الذاكرة المتاحة للعقدة:

 kubectl describe nodes k3s | grep Allocatable -A 5 Allocatable: cpu: 1 ephemeral-storage: 49255941901 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 2041888Ki 

إذا لم يتم تحديد حجم الذاكرة المطلوب ، فسيكون مساوياً للحد الأقصى. استبدال القيم ، نحصل على قيمة oom_score_adj التالية: 1000–123*1024/2041888=938.32 ، وهي قريبة جدًا من القيمة 939 المحددة في سجل النظام. (لا أعرف كيف تحصل OOM Killer على القيمة الدقيقة 939.)

لذلك ، جميع العمليات في الحاوية لها نفس القيمة oom_score_adj. يقوم مكون OOM Killer بحساب قيمة OOM استنادًا إلى استخدام الذاكرة وضبط النتيجة استنادًا إلى درجة oom_score_adj. وفي النهاية ، يدمر عملية اختبار التحمل الأول ، الذي أكل معظم الذاكرة ، 100 ميجابايت ، والذي يتوافق مع التقدير oom_score = 1718.

استنتاج


يتحكم Kubernetes في حد ذاكرة الموقد من خلال مكونات cgroup و OOM Killer. من الضروري التنسيق بعناية بين شروط نظام التشغيل OOM وموقد OOM.

كيف تحب المواد؟ تتم دعوة كل من يريد معرفة المزيد حول الدورة التدريبية إلى ندوة عبر الإنترنت مجانًا في 17 يونيو ، حيث سنقوم بدراسة قدرات Kubernetes لتنظيم ممارسات التسليم المستمر (CI / CD) والمناهج لفريق صغير مع العديد من التطبيقات ، وكذلك لمنظمة كبيرة مع عدد كبير من الأنظمة.

Source: https://habr.com/ru/post/ar456002/


All Articles