Score:6

หน่วยความจำที่คอมมิตใน Linux น้อยกว่าที่คาดไว้

ธง au

การใช้หน่วยความจำของเซิร์ฟเวอร์ linux ของฉันเป็นเรื่องแปลก เท่าที่ฉันทราบหน่วยความจำ Committed ที่ใหญ่กว่า (Committed_AS ใน /proc/meminfo หรือ kbcommit ใน sar -r) มากกว่าหน่วยความจำของแอปพลิเคชันที่ใช้เป็นเรื่องปกติ แต่หน่วยความจำคอมมิตของเซิร์ฟเวอร์ของฉันมีขนาดเล็กมาก

# cat /proc/meminfo
MemTotal: 32877480 kB
MemFree: 3511812 กิโลไบต์
บัฟเฟอร์: 19364 กิโลไบต์
แคช: 12080112 กิโลไบต์
สลับแคช: 0 กิโลไบต์
ใช้งานอยู่: 22658640 กิโลไบต์
ไม่ใช้งาน: 5906936 กิโลไบต์
ใช้งานอยู่(ไม่ใช้งาน): 16460116 kB
ไม่ใช้งาน (ไม่ใช้งาน): 6652 kB
ใช้งานอยู่(ไฟล์): 6198524 kB
ไม่ใช้งาน (ไฟล์): 5900284 kB
ไม่สามารถหลีกเลี่ยงได้: 0 kB
ล็อค: 0 kB
SwapTotal: 0 กิโลไบต์
สวอปฟรี: 0 กิโลไบต์
สกปรก: 544 กิโลไบต์
การเขียนกลับ: 4 kB
AnonPages: 16482208 kB
แมปแล้ว: 17228 kB
ชัม: 672 กิโลไบต์
พื้น: 529344 กิโลไบต์
เรียกคืนได้: 460220 kB
SUnreclaim: 69124 kB
KernelStack: 12304 กิโลไบต์
PageTables: 51412 กิโลไบต์
NFS_Unstable: 0 กิโลไบต์
การตีกลับ: 0 กิโลไบต์
WritebackTmp: 0 กิโลไบต์
CommitLimit: 16438740 กิโลไบต์
Commit_AS: 4484680 กิโลไบต์
VmallocTotal: 34359738367 กิโลไบต์
Vmalloc ใช้แล้ว: 66424 kB
VmallocChunk: 34359651996 กิโลไบต์
ฮาร์ดแวร์เสียหาย: 0 kB
AnonHugePages: 15376384 kB
HugePages_Total: 0
HugePages_ฟรี: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
ขนาดหน้าใหญ่: 2048 kB
DirectMap4k: 4096 กิโลไบต์
DirectMap2M: 2093056 กิโลไบต์
DirectMap1G: 31457280 กิโลไบต์

อย่างที่คุณเห็น Committed_AS มีขนาดประมาณ 4.4GB แต่กระบวนการหนึ่งใช้มากกว่า 14GB กระบวนการนี้ไม่มีไฟล์ mmaped หรือหน่วยความจำที่ใช้ร่วมกัน

# pidstat -r 1 1
ลินุกซ์ 2.6.32-696.16.1.el6.x86_64 (appintprdsearch01) 23/08/21 _x86_64_ (8 CPU)

16:56:34 PID minflt/s majflt/s คำสั่ง VSZ RSS %MEM
16:56:35 414 19476.24 0.00 17260248 14356476 43.67 isc_mc
# pmap -x 414 | egrep '^ที่อยู่|^ทั้งหมด'
ที่อยู่การแมปโหมดสกปรก Kbytes RSS
รวมกิโลไบต์ 17268588 14363848 14360208
# pmap -x 414 | grep อานนท์ | awk '{s+=$3} END {พิมพ์ s}'
14326736

ฉันสงสัยว่าเหตุใดหน่วยความจำที่ใช้ของกระบวนการนี้จึงไม่ส่งผลต่อหน่วยความจำที่ผูกมัด มีบางอย่างที่ฉันทำหายไปหรือไม่?

# cat / etc / system-release
Red Hat Enterprise Linux Server รีลีส 6.8 (ซันติอาโก)
# uname -r
2.6.32-696.16.1.el6.x86_64

ขอบคุณล่วงหน้า!!

แก้ไข: ฉันพยายามแสดงเอาต์พุต pmap -x แบบเต็มในวันนี้ แต่มีความยาว 758 บรรทัดและเกินขีดจำกัดการโพสต์ นี่คือบทสรุป และฉันพบว่าหน้าอานนท์ของมันใหญ่ขึ้นเรื่อยๆ

# pmap -x 414 | grep -vw อานนท์
414: /usr/local/search/sf-1v530/bin/isc_mc -license /usr/local/search/sf-1v530/license/license.xml -conf ../config/config_mc.xml -pid /usr/local /search/sf-1v530/pid/isc_mc.pid -log /usr/local/search/sf-1v530/log/isc_mc
ที่อยู่การแมปโหมดสกปรก Kbytes RSS
0000000000400000 4616 1720 0 r-x-- isc_mc
0000000000a81000 1304 716 20 rw--- isc_mc
0000003c54200000 128 108 0 r-x-- ld-2.12.so
0000003c54420000 4 4 4 ร---- ld-2.12.so
0000003c54421000 4 4 4 rw--- ld-2.12.so
0000003c54600000 1576 584 0 r-x-- libc-2.12.so
0000003c5478a000 2048 0 0 ----- libc-2.12.so
0000003c5498a000 16 16 8 r---- libc-2.12.so
0000003c5498e000 8 8 8 rw--- libc-2.12.so
0000003c54a00000 92 72 0 r-x-- libpthread-2.12.so
0000003c54a17000 2048 0 0 ----- libpthread-2.12.so
0000003c54c17000 4 4 4 r---- libpthread-2.12.so
0000003c54c18000 4 4 4 rw--- libpthread-2.12.so
0000003c55600000 524 80 0 r-x-- libm-2.12.so
0000003c55683000 2044 0 0 ----- libm-2.12.so
0000003c55882000 4 4 4 r---- libm-2.12.so
0000003c55883000 4 4 4 rw---libm-2.12.so
0000003c55a00000 84 16 0 r-x-- libz.so.1.2.3
0000003c55a15000 2044 0 0 ----- libz.so.1.2.3
0000003c55c14000 4 4 4 ร---- libz.so.1.2.3
0000003c55c15000 4 4 4 rw--- libz.so.1.2.3
0000003c56600000 88 16 0 r-x-- libgcc_s-4.4.7-20120601.so.1
0000003c56616000 2044 0 0 ----- libgcc_s-4.4.7-20120601.so.1
0000003c56815000 4 4 4 rw---libgcc_s-4.4.7-20120601.so.1
0000003c57200000 928 488 0 r-x-- libstdc++.so.6.0.13
0000003c572e8000 2048 0 0 ----- libstdc++.so.6.0.13
0000003c574e8000 28 28 28 r---- libstdc++.so.6.0.13
0000003c574ef000 8 8 8 rw--- libstdc++.so.6.0.13
00007ffdcbf56000 84 48 48 rw--- [ สแต็ค ]
---------------- ------ ------ ------
รวมกิโลไบต์ 18462068 15806748 15802956

นี่เป็นขนาดที่เรียงลำดับของแผนที่อานนท์และจำนวนของมัน

# pmap -x 414 | grep -w อานนท์ | awk '{s[$2]++} END {สำหรับ (x ใน s) {พิมพ์ x,s[x]}}' | เรียงลำดับ
-rnk 1
254728 1
225520 1
197220 1
196608 1
131480 2
131072 2
124008 1
65740 3
65536 142
65532 5
65528 3
65524 2
65520 1
65512 2
65508 2
65504 3
65500 3
65488 2
65484 5
65480 2
65476 1
65464 2
65456 1
65452 1
65448 2
65440 4
65436 3
65432 3
65428 2
65424 1
65420 28
65412 1
65404 1
65400 1
65372 1
65192 1
65188 1
64804 1
64636 1
63940 1
63912 1
63792 1
63584 1
63408 1
63400 2
63244 1
63008 2
63004 1
61996 1
61848 1
61792 1
61624 1
60976 1
59940 1
58276 1
57736 1
55992 1
52348 1
51212 1
50084 1
40840 1
24696 1
15452 1
14324 1
13188 1
10396 1
10240 1
9544 1
7800 1
7260 1
7064 1
5596 1
4560 1
3912 1
3744 1
3688 1
3540 1
3216 1
2532 1
2528 2
2292 1
2136 2
2128 1
พ.ศ. 2495 1
1744 1
1624 1
1596 1
1024 169
900 1
732 1
348 1
344 1
164 1
136 1
132 1
124 1
116 28
112 1
108 2
104 3
100 3
96 4
88 2
84 2
80 1
72 2
60 1
56 2
52 5
48 2
36 3
32 3
28 2
24 2
16 3
12 2
8 4
4 179

แก้ไข: ฉันได้ร้องขอการสนับสนุนลูกค้าไปยัง Redhat ฉันเกรงว่าจะไม่ได้รับ anwser ใด ๆ เนื่องจาก RHEL6 ถูก EOSed อย่างไรก็ตามฉันจะโพสต์ผลลัพธ์ที่นี่

Matthew Ife avatar
jo flag
น่าสนใจที่จะเห็นเอาต์พุต `pmap -x` แบบเต็ม
John Mahowald avatar
cn flag
โปรแกรมที่เห็นได้ชัดว่ามีการจัดสรรอานนท์จำนวนมากคืออะไร? มันใช้ malloc() mmap() หรือฟังก์ชันการจัดสรรอื่น ๆ ที่จะทำหรือไม่
hoolaboy avatar
au flag
@John Mahowald เนื่องจากเป็นโปรแกรมเชิงพาณิชย์ เราจึงไม่สามารถตรวจสอบซอร์สโค้ดได้ มีเพียงเราเท่านั้นที่ทำได้คือติดตามมัน นี่คือเครื่องมือค้นหาชนิดหนึ่ง และเป็นธรรมชาติที่โปรแกรมนี้ใช้หน่วยความจำขนาดใหญ่
Matthew Ife avatar
jo flag
อีกสิ่งหนึ่งที่ต้องตรวจสอบคือ `/proc/414/smaps` ซึ่งควรแจกแจงว่าการจัดสรรเพจเป็นเพจขนาดใหญ่โปร่งใสกี่รายการ 'ลางสังหรณ์' ปัจจุบันของฉันคือการจัดสรร THP นับเป็นหน้า 4096 ไบต์ใน `Committed_AS` เมื่อควรนับเป็นหน้า 2048 kbyte แทน
Matthew Ife avatar
jo flag
ฉันเขียนโปรแกรมเพื่อทดสอบ THP ที่นับไม่ถูกต้องตามทฤษฎีและไม่เป็นความจริง ดังนั้นสิ่งที่เป็นสาเหตุนี้ไม่เกี่ยวข้องกับสิ่งนั้น อาจต้องการเอาต์พุต smaps ณ จุดนี้
hoolaboy avatar
au flag
@Matthew Ife: ขอบคุณสำหรับคำแนะนำของคุณ ฉันควรตรวจสอบจุดใดในเอาต์พุต smaps
Matthew Ife avatar
jo flag
@hoolaboy โดยทั่วไปจะแบ่งหน้าโดยการสำรองร้านค้าและการจัดเรียงปัจจุบันของหน้าการแมป (หากอยู่ในการแลกเปลี่ยน ฯลฯ ) ฉันหวังว่ามันจะให้คำอธิบายโดยละเอียดเพิ่มเติมว่าการแมปคืออะไรและมาจากไหน/อย่างไร ซึ่งอาจอธิบายพฤติกรรมที่ผิดปกติของ `/proc/meminfo`
Score:3
ธง cn

หน่วยความจำครึ่งหนึ่งของโฮสต์นี้อยู่ในหน้าส่วนตัวส่วนใหญ่เป็นกระบวนการที่คุณระบุ Commit_AS ค่อนข้างต่ำที่ 14% ของ MemTotal หมายความว่ายังใช้งานข้อมูลจริงไม่มากนัก

ระบบปฏิบัติการขี้เกียจ Linux จะไม่แตะต้อง 14 GB ที่โปรแกรมนี้ขอทั้งหมด แต่เนื่องจาก x86 CPU นี้รองรับเพจ 2 MB และ 1 GB Linux จึงมอบหมายหลายรายการให้กับกระบวนการนี้และแสร้งทำเป็นว่าไม่มีศูนย์เลย สังเกต DirectMap แสดงหน้าฮาร์ดแวร์จำนวนมากขนาด 1 GB HugePages สามารถกำหนดค่าได้อย่างชัดเจนโดยผู้ดูแลระบบ แต่ meminfo นั้นแสดงค่าเป็นศูนย์จากค่าที่กำหนดค่าไว้

เพียงแค่การจัดสรรนี้ใช้หน่วยความจำกายภาพน้อยมาก Commit_AS เริ่มต่ำ หากแอปพลิเคชันกรอกข้อมูลเหล่านี้ด้วยข้อมูลจริง มันจะเพิ่มขึ้น

เกี่ยวกับการวางแผนความจุ ตอนนี้โฮสต์นี้มีหน่วยความจำมากมาย Anon และหน่วยความจำที่ใช้ร่วมกันถูกจำกัดไว้ที่ครึ่งหนึ่ง แคช 36% เพื่อการเข้าถึงไฟล์ที่รวดเร็ว และหน่วยความจำว่างและไม่ได้ใช้ไม่กี่ GB เพื่อตอบสนองความต้องการในการจัดสรรหน่วยความจำในทันที และแน่นอนว่า Commit_AS ไกลออกไป MemTotal

แม้ว่าการจัดสรรหน่วยความจำของแอปพลิเคชันจะพอดีกับขนาดของโฮสต์ ค้นหาว่าทำไมมันถึงมีขนาดเช่นนั้น หากนี่คือขนาดฐานข้อมูลในหน่วยความจำสำหรับการเติบโตในอนาคต นั่นอาจสมเหตุสมผล หรืออาจเป็น 32 GB เป็น VM ขนาดกลาง / เซิร์ฟเวอร์จริงขนาดเล็ก การปรับขนาดเกินอาจใช้งานได้ง่ายกว่า

Matthew Ife avatar
jo flag
ไม่เชื่อว่าเป็นความจริง ผู้ส่งแสดงว่าฟิลด์ 'rss' และ 'dirty' ของโปรแกรมมีขนาด 14GB ดูเหมือนว่าหน้าเหล่านี้จะถูกสัมผัสที่ไหนสักแห่งเนื่องจากสกปรก แม้ว่าอาจมีหน้าที่ใช้ร่วมกันและ/หรือไฟล์ในการแมปนั้นไม่ได้ถูกรวมไว้ในผลรวม awk
marcelm avatar
ng flag
_"ระบบปฏิบัติการขี้เกียจ Linux จะไม่แตะต้องทั้งหมด 14 GB ที่โปรแกรมนี้ขอ [...] การจัดสรรนี้ใช้หน่วยความจำกายภาพน้อยมาก ดังนั้น Committed_AS จึงเริ่มต่ำหากและเมื่อแอปพลิเคชันเติมข้อมูลจริง ข้อมูลเหล่านี้จะเพิ่มขึ้น"_ - อืม [Linux kernel documentation for Committed_AS](https://www.kernel.org/doc/html/v5.13/filesystems/proc .html#meminfo) ดูเหมือนจะขัดแย้งกับพฤติกรรมนี้ เอกสารประกอบอาจล้าสมัยหรือไม่ถูกต้อง หรือฉันอ่านไม่ถูกต้อง คุณมีแหล่งข้อมูลสนับสนุนคำอธิบายของคุณหรือไม่
Matthew Ife avatar
jo flag
@marcelm เป็นไปได้ที่คำตอบจะบอกเป็นนัยว่าไม่ได้รวมเพจขนาดใหญ่ที่โปร่งใสในการคำนวณ commit_as แต่ฉันไม่ได้อยู่ในช่องที่จะตรวจสอบซอร์สโค้ด VM หรือทดสอบสิ่งนั้น โดยส่วนตัวแล้วฉันรู้สึกว่ามีอะไรเกิดขึ้นมากกว่านี้ แต่ pmap ที่สมบูรณ์กว่านี้อาจช่วยได้
John Mahowald avatar
cn flag
ฉันอาจผิดเกี่ยวกับข้อมูลเฉพาะ และนี่ยังห่างไกลจากการอภิปรายที่สมบูรณ์ของหน้าเว็บขนาดใหญ่ ถึงกระนั้น เราสังเกตว่าทั้งระบบบนหน้าเว็บเกิน `Committed_AS` มาก การสำรวจรายละเอียดนี้อาจต้องทราบว่าแอปพลิเคชันใด ไม่ว่าจะใช้ malloc หรือ mmap และวิธีจัดสรรจำนวนมากนั้น ซึ่งไม่สำคัญสำหรับการวางแผนความจุ แม้ว่าเราจะถือว่าหน้านิรนามทั้งหมดจะต้องใช้งาน แต่ก็เหมาะกับโฮสต์ขนาด 32 GB อย่างง่ายดาย

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา