หน่วยความจำ 'ที่สูญเปล่า' สูงที่ไม่คาดคิดใน memcached


18

อัปเดตแล้วให้ดูที่ด้านล่างของคำถาม longish (ขออภัย)

ดูสถิติ memcached ของเราฉันคิดว่าฉันพบปัญหาที่ฉันไม่ทราบมาก่อน ดูเหมือนว่าเรามีพื้นที่ว่างจำนวนมากอย่างประหลาด ฉันตรวจสอบกับphpmemcacheadminสำหรับการเปลี่ยนแปลงและพบว่าภาพนี้จ้องมองที่ฉัน:

กราฟิกขนาดแคช memcached

ตอนนี้ฉันอยู่ภายใต้ความประทับใจว่าสถานการณ์กรณีเลวร้ายที่สุดคือมีของเสีย 50% แม้ว่าฉันจะเป็นคนแรกที่ยอมรับว่าไม่รู้รายละเอียดทั้งหมด ฉันได้อ่าน - ในหมู่อื่น ๆ - หน้านี้ซึ่งค่อนข้างเก่า แต่เป็นรุ่น memcached ของเรา ฉันคิดว่าฉันเข้าใจว่าระบบทำงานอย่างไร ( เช่น ) ฉันเชื่อ แต่ฉันมีเวลายากที่จะเข้าใจว่าเราจะได้พื้นที่ว่างเปล่าถึง 76% อย่างไร

อัตราการขับไล่ที่ phpmemcacheadmin แสดงคือ2 ev/sมีปัญหาอยู่ที่นี่

  • คำถามหลักคือ: สิ่งที่ฉันสามารถทำได้เพื่อแก้ไขปัญหานี้ ฉันสามารถโยนหน่วยความจำได้มากกว่านี้ (มีบางอย่างที่ฉันคิดว่าพิเศษ) บางทีฉันควรจะเล่นซอกับ config slab (เป็นไปได้ที่จะใช้เวอร์ชั่นนี้ไหม) อาจมีตัวเลือกอื่น ๆ อีกไหม? การอัพเกรดรุ่น memcached ไม่ใช่ตัวเลือกที่ใช้ได้อย่างรวดเร็ว

  • คำถามที่สองออกมาจากความอยากรู้แน่นอนว่าถ้าอัตรา 75% (และเพิ่มขึ้น) เสียพื้นที่ถูกคาดหวังและถ้าเป็นเช่นนั้นทำไม

ระบบ: นี่ไม่ใช่สิ่งที่ฉันสามารถทำอะไรได้ในขณะนี้ฉันรู้ว่ารุ่น memcached ไม่ใช่รุ่นล่าสุด แต่เป็นการ์ดที่ฉันจัดการ

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

ตามการตอบกลับของ @DavidSchwartz คำตอบ: นี่คือสถิติของพื้นที่ phpmemcacheadmin สร้าง: (มีแผ่นพื้น btw มากกว่านี้)

( ฉันยังวางสถิติจากอีกไม่ช้าในรูปแบบข้อความที่นี่ )

รายละเอียดพื้น

UPDATE

ฉันรีสตาร์ท daemon ด้วย -f 1.5 และมันก็ดูดีมาก หลังจากภาวะโลกร้อนเราได้ใช้ / เสีย 50/50 แต่เหมือนเมื่อก่อนที่เรามีอีกต่อไปในวัน (มันจะยุ่งมากขึ้นในระหว่างวัน) มันเริ่มกลับไปที่ปัจจุบัน: 30/70 และการสูญเสียยังคงเพิ่มขึ้น นอกจากนั้นฉันยังไม่รู้ว่า 'เสีย' มาจากไหน ฉันเห็นแผ่นนี้:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

มันไม่เต็มไม่มีการขับไล่ออก แต่เสีย 117.3 MBytes การคำนวณอย่างรวดเร็วที่ฉันทำ (แก้ไขฉันถ้าฉันผิด) คือ:

  • แผ่นพื้นก่อนหน้ามีขนาดก้อน 328 ดังนั้นกรณีที่เลวร้ายที่สุดแผ่นนี้เต็มไปด้วยชิ้นขนาด 329 ไบต์
  • นี่หมายความว่าเป็นการสิ้นเปลือง 167 ไบต์ต่อชิ้นที่ใช้ = 12942834 ไบต์ = 12.3 MB

แล้วอีก105 MB ที่เสียไปนั้นมาจากไหน? มันเป็นพี่ใหญ่ที่อยู่ติดกับหน้าตาแบบนี้:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109

ปัญหาคือมีพื้นที่ที่ไม่ได้ใช้เป็นจำนวนมากในแผ่นพื้นอื่น ๆ แต่แผ่นที่ 3 เต็ม 100% และเห็นการขับไล่
David Schwartz

จุดดีที่จะอธิบายถึงการขับไล่แม้ว่าฉันจะไม่แน่ใจจริง ๆ ว่ามีการคำนวณจำนวนที่ 'สูญเปล่า' อย่างไร ถ้าแผ่นพื้น 8 มีการใช้เพียง 13.9% จะต้องมีพื้นที่ "ว่าง" เหลืออยู่ใช่ไหม?
Nanne

ใช่มีพื้นที่ว่างในแผ่นพื้นนั้น แต่นั่นไม่ได้ช่วยถ้าวัตถุที่ถูกขับไล่ไม่ไปอยู่ในแผ่นหินนั้น
David Schwartz

นั่นคือสิ่งที่ฉันคิดจากคำตอบของคุณ แต่ทำไมไม่มีพื้นที่ว่างในรายการ? ควรมีบางส่วนของแผนภูมิวงกลมสีขาว (ตามที่ติดตั้งในการทดสอบของฉัน) หากยังมีพื้นที่เหลืออยู่อย่างน้อยนั่นคือสิ่งที่ฉันคิด
Nanne

คำตอบ:


10

เป็นเวลาหนึ่งปีแล้วที่คำถามนี้และฉันไม่รู้ว่าคุณพบคำตอบของคุณหรือไม่ แต่ฉันจะบอกว่าการรับรู้ของคุณเกี่ยวกับ "การสูญเปล่า" นั้นผิด

หน่วยความจำที่สูญเปล่าถูกจัดสรรในหน่วยความจำดังนั้นจึงไม่สามารถใช้งานได้โดยแอปพลิเคชันอื่น แต่ยังคงมีให้สำหรับ memcached

หากต้องการทำให้คำอธิบายง่ายขึ้นสมมติว่าคุณมี memcache ที่มี RAM 3MB พร้อม 3 Slabs:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

ดำเนินการ "ชุด" เดียวที่มีขนาด 10k คุณจะเห็นสถิติของคุณ (คร่าวๆ) ที่คุณมี:

0.03% used
66.6% free
33% wasted

นี่เป็นเพราะ memcached จัดสรรชิ้นเดียวจาก "แผ่นคลาส 1" และ 99% ของหน่วยความจำสำหรับแผ่นพื้นนั้น "เสีย" และ 1% คือ "ใช้" นี่ไม่ได้หมายความว่าแผ่นพื้นและหน่วยความจำที่จัดสรรสำหรับแผ่นพื้นนั้นจะหายไป

ดำเนินการ "set" อีกชุดเดียวด้วยขนาด 10k เวลานี้คุณจะเห็น:

0.06% used
66.6% free
32.7% wasted

ดังนั้นตอนนี้คุณกำลังใช้ 2 จาก 100 ชิ้นที่จัดสรรในแผ่นพื้น 1, สถิติ "สูญเปล่า" ลดลงและสถิติที่ใช้เพิ่มขึ้น

ไม่มีอะไรผิดปกติสำหรับการใช้% + ที่สูญเปล่าไปแล้ว% เท่ากับ 100% นั่นไม่ได้หมายความว่าคุณไม่มีหน่วยความจำเหลืออยู่เลยมันก็หมายความว่าคุณจัดสรรอย่างน้อยหนึ่งอันจากแต่ละแผ่น

หากต้องการดูปัญหานี้เป็น "ชุด" ที่มีขนาด 100k และอีกชุดหนึ่งที่มีขนาด 1,000k

ตอนนี้คุณจะเห็น

36.6% used
   0% free
63.3% wasted

นั่นฟังดูดี! คุณมีลิงค์ใด ๆ เพื่อสำรองข้อมูลหรือไม่ ถ้าเป็นเช่นนั้นหมายความว่า memcache-server ของฉันทำงานได้ดีขึ้นเราคิดว่า :) ถ้าฉันเข้าใจคุณอย่างถูกต้องก็คือความสูญเปล่าหมายถึงมันได้รับการจัดสรรแล้ว แต่ก็ยังสามารถใช้ได้ ซึ่งหมายความว่าหากไม่มีสิ่งใดว่างคุณไม่สามารถจัดสรรแผ่นพื้นได้มากขึ้น แต่ไม่ควรหมายความว่าคุณมีปัญหาต่อหรือไม่
Nanne

1
ฉันไม่มีลิงค์อยู่ด้านบนของหัว แต่ง่ายมากในการทดสอบด้วยตัวเอง กดบรรทัดคำสั่งของคุณและสร้างเซิร์ฟเวอร์ขนาดเล็กตัวอย่างเพื่อทดสอบวิธีการทำงาน คุณสามารถใช้ตัวเลือก -vv สำหรับข้อความดีบั๊กซึ่งจะแสดงแผ่นพื้นที่สร้างขึ้นครั้งแรกเช่น: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" จะสร้างแผ่น 3 แผ่นที่มีขนาด 10k 100k และ 1,000k และให้ออก "ชุด" และดูสถิติที่คุณเสีย / ใช้แล้วเปลี่ยนแปลงไปตามที่ฉันอธิบายไว้ข้างต้น
kali

จุดดี. ตอนนี้จะหาวิธีที่ฉันจะได้รับความสนใจเป็นพิเศษในการตอบนี้สำหรับคุณ :)
Nanne

6

คุณอาจมีวัตถุขนาดเล็กจำนวนมากมาก โดยทั่วไปแผ่นพื้นที่เล็กที่สุดจะมีขนาด 104 ไบต์ หากคุณมีรายการจำนวนมากที่แมปจำนวนเต็มหนึ่งกับอีกรายการหนึ่งคุณสามารถทำให้เสียได้สูงถึง 85%

คุณสามารถค้นหาข้อมูลเกี่ยวกับวิธีการปรับแต่งรอบนี้ในบทความmemcached สำหรับวัตถุขนาดเล็ก


หากฉันอ่านหน้าสถิติอย่างถูกต้องนี่ไม่ใช่กรณี ขยะส่วนใหญ่อยู่ในพื้นด้วย 480.0 ไบต์ชิ้น ผมขอตรวจสอบหากฉันสามารถแสดงสถิติบางอย่าง ...
Nanne

โอ้แล้วนี่เป็นเรื่องปกติและปกติไม่มีอะไรต้องกังวล ตอนนี้มีข้อมูลน้อยลง (ตัวอย่างเช่นแผ่นพื้นที่ใช้เพียง 14%)
David Schwartz

แต่ 75% เสียวิธีปกติอย่างไร หมายเลขนี้รวมพื้นที่ที่ไม่ได้ใช้หรือไม่ ฉันคาดว่าจะนับเป็น "ฟรี" นอกจากนี้เรายังเห็นว่าการสูญเสีย // การลดลงของหน่วยความจำที่ใช้เพิ่มขึ้นเมื่อวันผ่านไป นั่นและความจริงที่ว่าเรามีการขับไล่ทำให้ฉันสงสัยว่าจะทำอะไรได้บ้าง
Nanne

การมีแผ่นพื้นน้อยลงอาจช่วยหลีกเลี่ยงปัญหาหน่วยความจำมากเกินไปที่ติดอยู่ในแผ่นพื้นที่ไม่ถูกต้อง ตัวอย่างเช่น-f 1.5 -I 2800อาจช่วย
David Schwartz

man-page ไม่ชัดเจนเกินไป: -I 2800นั่นหมายถึง 2800K ซึ่งต่างไปจากค่าเริ่มต้น 1M ใช่หรือไม่
Nanne

-1

ฉันมีปัญหานี้และย้ายจาก memcached ไปที่ Redis (โดยไม่บันทึกจากดิสก์) ฉันรู้ว่านี่อาจเป็นไปไม่ได้ แต่คุณสามารถลองเป็นตัวเลือกและจับตาดูการกระจายตัวของหน่วยความจำ คุณสามารถเปิดการคงอยู่เพื่อแก้ไขปัญหา "แคชเก่า" เมื่อรีสตาร์ท

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.