เหตุใด Windows 2008 จึงใช้ swap ก่อนที่หน่วยความจำจะเต็ม


9

ฉันจัดการเซิร์ฟเวอร์ Windows 2008 (อย่างดีใน Amazon EC2) ที่ใช้ IIS และแอปเว็บ. NET4 ฉันได้รับการแจ้งเตือนหน่วยความจำเมื่อวันก่อนและไปและดูและหน่วยความจำกระบวนการได้เพิ่มขึ้นเมื่อเวลาผ่านผ่านการรั่วไหลช้าบางชนิด มันไม่ได้เติบโตขึ้นมากเช่น 60M ถึง 200M แต่พออื่น ๆ เกิดขึ้นพร้อมกล่องที่ผ่านเกณฑ์ที่ค่อนข้างต่ำของเรา (75%) เพื่อตั้งค่าจอภาพ

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

บางทีนี่อาจเป็นคำถามพื้นฐาน แต่ฉันเป็นคนที่ใช้ระบบปฏิบัติการยูนิกซ์และฉันเคยชินกับการที่ไม่ได้ใช้จนกว่าคุณจะจำไม่ได้ กล่องนี้ไม่เคยมีการใช้งานหน่วยความจำเกิน 75% นี่เป็นสิ่งที่ Windows หรือสิ่ง. NET หรือสิ่งที่ Amazon หรือไม่? ฉันสงสัยว่ามีการรั่วไหลของหน่วยความจำขนาดใหญ่กว่าในแอพนี้กว่าที่สงสัย - มันไม่รั่วจาก 60M ถึง 200M มันรั่วไหลจาก 60M เป็น 1.2GB แต่ส่วนใหญ่มันจะ "เย็น" และถูกผลักออกมาเพื่อแลกเปลี่ยนหรือเปล่า?

ฉันได้ตั้งค่าการรีไซเคิลหน่วยความจำไว้ในกลุ่มแอพพลิเคชั่น แต่มันทำให้เกิดหน่วยความจำเต็มรูปแบบในกล่องดังนั้นแอปนี้อาจใหญ่ขึ้นจริง ๆ ก่อนที่มันจะนำกลับมาใช้ใหม่โดยอัตโนมัติ

ฉันสามารถตั้งค่าการรีไซเคิลตามปกติ "หมดเวลา" แต่นั่นเป็นวิธีแก้ปัญหาฉันจะได้รับ dev เพื่อแก้ไขแอป แต่ต้องเข้าใจสิ่งที่เกิดขึ้นที่นี่ด้วยการใช้ swap เพื่อให้แน่ใจว่าฉันเข้าใจถูกต้อง

แก้ไขด้วยข้อมูลเพิ่มเติม: หน่วยความจำอินสแตนซ์: การแลกเปลี่ยน 1.7 GB: 4.5 GB

ฉันเห็นกระบวนการ w3wp.exe ใน taskmgr แสดงว่า Memory: 211,000k แต่เมื่อฉันรีสตาร์ทมัน (อยู่ในแอพพูลของตัวเองและเป็นแอพเดียวในกล่อง) การใช้หน่วยความจำของมันลดลงถึงจุดเริ่มต้นปกติที่ 60M และเช่นเดียวกับ swap 1 GB + เช่นกัน ใน taskmgr ฉันเพิ่งมีหน่วยความจำปกติ (ชุดทำงานส่วนตัว) ขึ้น แต่เห็นการเปลี่ยนแปลงการแลกเปลี่ยนผ่านการตรวจสอบอื่น ๆ ของฉัน (Cloudkick) การย้อนกลับไปดูที่วันนี้หน่วยความจำกลับมาที่ 195M ในกระบวนการ (รวม 1.2 GB) และการสลับได้พุ่งจาก 1.0 GB เป็น 1.1 GB ไม่ซื้อตลอดเวลาที่สำรอง (กราฟอยู่ตลอดเวลามันเป็น คืบคลานช้า)

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


4
BTW, อย่างน้อยลีนุกซ์จะแลกเปลี่ยนหน้าเว็บอย่างฉวยโอกาสหากพวกเขาไม่ได้รับการเข้าถึงเป็นเวลานานแม้ว่าระบบจะไม่ได้ใกล้เคียงกับการใช้ RAM ที่มีอยู่ทั้งหมด มันทำเช่นนี้เพื่อเพิ่มหน่วยความจำสำหรับดิสก์แคชบัฟเฟอร์ ฯลฯ
EEAA

อินสแตนซ์นี้มีหน่วยความจำเท่าใด คุณกำลังบอกว่ากระบวนการ w3wp.exe กดปุ่ม 1GB หรือไม่ นี่เป็นไซต์เดียวที่ทำงานในกลุ่มแอปพลิเคชันนั้นหรือไม่
Kev

@ KevΩเพิ่มข้อมูลเพิ่มเติมใน Q ตามคำขอของคุณ
เออร์เนสต์มุลเลอร์

@ErikA รู้ดีฉันเดาว่าฉันฟังคนที่พูดว่า "ถ้าคุณกำลังแลกเปลี่ยนคุณมีประสิทธิภาพอึอยู่แค่ปิดการแลกเปลี่ยนโดยสิ้นเชิงและอย่าหมด RAM" ดังนั้นฉันจึงไม่ ' ไม่ต้องดูการแลกเปลี่ยนมากนัก
เออร์เนสต์มุลเลอร์

หากดิสก์ของคุณกำลังฟาดไปที่ดิสก์นั่นเป็นเรื่องจริง หากมีการแลกเปลี่ยนก็จะทำให้มีพื้นที่สำหรับบัฟเฟอร์และเช่น
Bart Silverstrim

คำตอบ:


17

Windows และ linux มีสองหน้า / การแลกเปลี่ยนที่แตกต่างกัน

ลินุกซ์

Linux ต้องการหลีกเลี่ยงการใช้พื้นที่สว็อปเลยและรอจนกระทั่งวินาทีสุดท้ายที่เป็นไปได้ หากคุณเห็นการแลกเปลี่ยนจำนวนมากใน linux แสดงว่าระบบของคุณมีปัญหาหรือมีปัญหา กลยุทธ์นี้ดีสำหรับการลดดิสก์โดยรวมให้น้อยที่สุดซึ่งเป็นส่วนที่ช้าที่สุดของระบบของคุณ แต่จะปรับตัวลดลงสำหรับระบบที่มีช่วงเวลาแสงน้อยและโหลดหนัก (และโดยสุจริตนั่นคือพวกเราส่วนใหญ่) เวลาที่โหลดของคุณหนักอยู่แล้วในขณะนี้จะมีภาระจากดิสก์ "พิเศษ" / หรืออีกวิธีหนึ่งคุณต้องออกแบบเซิร์ฟเวอร์ของคุณด้วยสายตาที่มี ram เพียงพอคุณไม่ต้องสลับแม้ในระหว่าง เวลาในการโหลดสูงสุดที่คาดไว้

ของ windows

Windows ต้องการจัดการกับหน่วยความจำเป็นเพียงแคชของไฟล์หน้า หน่วยความจำจริงของคุณอยู่บนดิสก์เสมอ แต่จะอ่าน / เขียนจาก "แคช" ก่อนถ้าทำได้ กลยุทธ์นี้ดีสำหรับตอนเย็นภาระของคุณเมื่อเวลาผ่านไป; เมื่อระบบไม่ว่างและจำเป็นต้องสลับเพจหน้าปัจจุบันจะมีอยู่แล้วในดิสก์และครึ่งหนึ่งของงานเสร็จเรียบร้อยแล้ว วิธีนี้ทำให้เกิดความรู้สึกที่ยอดเยี่ยมเมื่อ Windows ยังเด็ก 32MB (ลืม GB) ยังคงมี RAM อยู่จำนวนมากและจำเป็นต้องใช้พื้นที่สว็อป swap บ่อยครั้ง แม้กระทั่งทุกวันนี้มันก็ดีสำหรับการโหลดงานที่สลับกันระหว่างแสงและการโหลดที่ไม่ว่างเนื่องจากมันช่วยกระจายดิสก์ i / o ออกให้สม่ำเสมอมากขึ้นเมื่อเวลาผ่านไป

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

การลู่เข้า

แนวคิดของการวัดหรือทำนายการโหลดในสภาพแวดล้อมการทดสอบก่อนแล้วจึงจัดสรรทรัพยากรการผลิตเมื่อทราบว่าการโหลดเป็นการพัฒนาที่ค่อนข้างเร็วในการสร้างระบบทำให้เป็นไปได้หรืออย่างน้อยก็ในทางปฏิบัติในส่วนของการถือกำเนิดของเซิร์ฟเวอร์เสมือน . คุณอาจออกแบบระบบเพื่อให้ไม่ต้องเปลี่ยนเลยทั้งนี้ขึ้นอยู่กับโหลดของคุณ ในกรณีเหล่านี้ Windows จะอนุญาตให้คุณปิดเพจจิ้งและทำงานเหมือนระบบลินุกซ์ อย่างไรก็ตามคุณต้องระวัง หากการออกแบบระบบของคุณต้องการหน่วยความจำมากกว่าที่คาดไว้คุณสามารถมีปัญหาด้วยวิธีนี้

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


เฉพาะเจาะจงมากกับกลยุทธ์สิ้น Windows ขอบคุณ! นอกจากนี้ตรวจสอบโดย KB ของ Microsoft นี้ฉันพบ ... support.microsoft.com/kb/2267427
Ernest Mueller

1
Linux ไม่จำเป็นต้องรอช่วงเวลาสุดท้ายที่เป็นไปได้เว้นแต่คุณจะตั้งค่า vm.swappiness = 0 อย่างชัดเจน ที่ค่าเริ่มต้น 60 หน้าจะสลับหน้าเว็บที่ไม่ได้สัมผัสเป็นระยะเวลาหนึ่ง
Kjetil Joergensen

@KjetilJoergensen ทำให้แน่ใจว่าคุณอ่านหัวข้อสุดท้ายเกี่ยวกับการบรรจบกัน
Joel Coel

1
@JoelCoel ฉันเพิกถอนการวิจารณ์ของฉันอย่างไม่มีเงื่อนไข)
Kjetil Joergensen

7

Windows (และ Linux และระบบปฏิบัติการ Unix-a-like) จะย้ายหน้าเว็บที่ไม่ได้ใช้งานไปยังดิสก์เป็นระยะเวลาหนึ่งเพื่อให้มีที่ว่างสำหรับบัฟเฟอร์และแคชเพื่อเร่งกิจกรรม I / O ที่ใช้งานอยู่ นอกจากนี้แอปพลิเคชันมักจะจัดสรรหน่วยความจำมากกว่าที่จะใช้ในทันที - ซึ่งอาจกระตุ้นให้เคอร์เนลหน้าบางสิ่งที่ไม่ได้สัมผัสเมื่อไม่นานมานี้ในพื้นหลังเพื่อให้แอปพลิเคชันดังกล่าวไม่เห็นความล่าช้าในการเพจ ใช้การจัดสรรนั้น

ภายใต้ Linux คุณสามารถปรับแต่ง (หรือปิดกั้น) พฤติกรรมนี้ได้โดยการเปลี่ยนค่า "swappiness" ที่เกี่ยวข้องใน/procระบบไฟล์ - ไม่ต้องสงสัยเลยว่ามีค่ารีจิสทรีที่คุณสามารถปรับแต่งเพื่อปรับเปลี่ยนวิธีการทำงานของ Windows ในเรื่องนี้ได้เช่นกัน

อีกสิ่งที่ควรระวังคือเมื่อสิ่งใดถูกเพจเอาต์และอ่านใหม่ในภายหลังเคอร์เนลจะไม่ลบมันออกจากไฟล์หน้าจนกว่าไฟล์นั้นจะเต็มหรือมิฉะนั้นเพจใน RAM จะถูกเปลี่ยน วิธีนี้หากต้องการเพจที่มีขนาดใหญ่อีกครั้งสามารถทำได้โดยไม่ต้องเขียนเพจลงดิสก์: เนื้อหามีอยู่แล้ว สิ่งนี้สามารถปรับปรุงประสิทธิภาพได้อย่างมากในสถานการณ์ที่หน่วยความจำเกินความจำแย่มากจนทำให้ไฟล์หน้า (จำนวนหน้าที่มีการแมปเข้าและออกอย่างต่อเนื่อง) คุณมีแนวโน้มที่จะพบว่าข้อมูลบางส่วนถูกส่งออกมาเนื่องจากการรั่วไหลของหน่วยความจำและมีการอ่านย้อนหลัง แต่ไม่ได้เช็ดจากดิสก์ในกรณีที่หน้าเหล่านั้นจำเป็นต้องแมปออกหรือ RAM เพื่อให้มีที่ว่างอีกครั้งในภายหลัง ภายใต้ Linux ค่า "SwapCached" ใน/proc/meminfoแสดงจำนวนข้อมูลที่มีอยู่ในเพจที่มีสำเนาเหมือนกันใน RAM และบนดิสก์ Windows ไม่ต้องสงสัยเลยว่าใช้การปรับให้เหมาะสมแบบเดียวกัน (หรือคล้ายกัน) แต่ฉันไม่ตรงที่จะดูว่ามันเกิดขึ้นมากแค่ไหน (ไม่ต้องสงสัยเลยว่ามีเคาน์เตอร์ตรวจสอบประสิทธิภาพที่เกี่ยวข้องที่คุณสามารถสอบถามได้)

tl; dr:นี่เป็นเรื่องปกติ เคอร์เนลระบบปฏิบัติการที่ทันสมัยจะพยายามฉลาดและเพิ่มจำนวน RAM ที่สามารถใช้เป็นแคชเพื่อบันทึกการดำเนินการของ I / O และบางครั้งจะมีการคัดลอกข้อมูลในดิสก์และใน RAM เพื่อบันทึก I / O หากจำเป็นต้องออกบิตเหล่านั้น ของ RAM ในภายหลัง โอกาสที่จะใช้งานได้ง่ายเช่นเดียวกับการใช้ไฟล์หน้านี้ในสองวิธีนี้แม้ว่าคุณจะไม่ได้อยู่ในระดับต่ำในปัจจุบันของ RAM ก็กำลังปรับปรุงประสิทธิภาพโดยรวมของคุณมากกว่าที่จะลดลง

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