ฉันมีเซิร์ฟเวอร์ Linux (Fedora 17) เสมือนที่มี 28GB RAM และ 2GB swap เซิร์ฟเวอร์กำลังใช้งานฐานข้อมูล MySQL ซึ่งตั้งค่าให้ใช้ RAM ส่วนใหญ่
หลังจากใช้เวลาสักครู่เซิร์ฟเวอร์จะเริ่มใช้ swap เพื่อสลับหน้าเว็บที่ไม่ได้ขาย นั่นเป็นสิ่งที่ดีเพราะความรวดเร็วของฉันอยู่ที่ 60 และเป็นพฤติกรรมที่คาดหวัง
สิ่งที่แปลกคือตัวเลขใน top / meminfo ไม่ตรงกับข้อมูลจากกระบวนการ นั่นคือเซิร์ฟเวอร์กำลังรายงานตัวเลขเหล่านี้:
/proc/meminfo:
SwapCached: 24588 kB
SwapTotal: 2097148 kB
SwapFree: 865912 kB
top:
Mem: 28189800k total, 27583776k used, 606024k free, 163452k buffers
Swap: 2097148k total, 1231512k used, 865636k free, 6554356k cached
หากฉันใช้สคริปต์จาก/server//a/423603/98204จะรายงานตัวเลขที่สมเหตุสมผล (ไม่กี่เมกะไบต์สลับจาก bash'es, systemd และอื่น ๆ ) และการจัดสรรขนาดใหญ่หนึ่งรายการจาก MySQL (ฉันไม่ได้ใช้บรรทัดเอาต์พุตจำนวนมาก ):
892 [2442] qmgr -l -t fifo -u
896 [2412] /usr/libexec/postfix/master
904 [28382] mysql -u root
976 [27559] -bash
984 [27637] -bash
992 [27931] SCREEN
1000 [27932] /bin/bash
1192 [27558] sshd: admin@pts/0
1196 [27556] sshd: admin [priv]
1244 [1] /usr/lib/systemd/systemd
9444 [26626] /usr/bin/perl /bin/innotop
413852 [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264 Total Swap Used
ดังนั้นหากฉันได้รับผลลัพธ์สคริปต์ที่ถูกต้องการใช้ swap ทั้งหมดควรเป็น 449264K = ca 440MB เมื่อใช้ mysql โดยประมาณ 90% ของการแลกเปลี่ยน
คำถามคือทำไมสิ่งนี้แตกต่างมากจากหมายเลขด้านบนและ meminfo? มีวิธีใดบ้างที่จะ "แลกเปลี่ยนข้อมูล" เพื่อดูว่ามีอะไรเกิดขึ้นจริงในนั้นแทนที่จะรวมการใช้ประโยชน์จากการแลกเปลี่ยนจากกระบวนการทั้งหมดหรือไม่
เมื่อวิเคราะห์ปัญหาฉันพบความคิดที่แตกต่างกัน แต่พวกเขาทั้งหมดดูเหมือนจะผิด:
- เอาต์พุตสคริปต์ไม่ได้อยู่ในหน่วย KB แม้ว่ามันจะอยู่ในหน่วย 512 หรือ 4KB มันจะไม่ตรงกัน ที่จริงแล้วอัตราส่วน (1200: 440) นั้นประมาณ 3: 1 ซึ่งเป็นตัวเลข "แปลก"
- มีบางหน้าในการแลกเปลี่ยนที่ใช้ร่วมกันอย่างใดระหว่างกระบวนการดังกล่าวในมี/server//a/477664/98204 หากเป็นจริงฉันจะค้นหาจำนวนหน่วยความจำที่ใช้จริงเช่นนี้ได้อย่างไร ฉันหมายความว่ามันจะต้องสร้างความแตกต่าง cca 800MB และนั่นไม่ได้เสียงที่เหมาะสมในสถานการณ์นี้
- มีหน้า "เก่า" บางส่วนในการแลกเปลี่ยนที่ใช้โดยกระบวนการที่เสร็จสิ้นไปแล้ว ฉันจะไม่คิดว่าถ้าฉันสามารถหาการแลกเปลี่ยน "ฟรี" นี้ได้เท่าไหร่
- มีหน้าในการแลกเปลี่ยนที่ได้รับการสลับกลับไปยังหน่วยความจำและอยู่ในการแลกเปลี่ยนเพียงในกรณีที่พวกเขาไม่ได้มีการเปลี่ยนแปลงใน RAM และจะต้องมีการสลับออกมาอีกครั้งตามที่กล่าวไว้ในที่มี /server//a/100636/98204 แต่ค่า SwapCached มีเพียง 24MB
สิ่งที่แปลกคือการใช้ swap เพิ่มขึ้นอย่างช้าๆในขณะที่ผลรวมจากสคริปต์นั้นค่อนข้างเหมือนกัน ใน 3 วันที่ผ่านมาการแลกเปลี่ยนที่ใช้เพิ่มขึ้นจาก 1100MB เป็น 1230MB ปัจจุบันในขณะที่ผลรวมเพิ่มขึ้นจาก 430MB เป็น 449MB ปัจจุบัน (แคลิฟอร์เนีย)
เซิร์ฟเวอร์มี RAM (สามารถ) ว่างได้เพียงพอดังนั้นฉันจึงสามารถปิดการแลกเปลี่ยนและเปิดอีกครั้ง หรือฉันอาจตั้งค่า swappiness เป็น 0 ดังนั้นการแลกเปลี่ยนจะได้ใช้ถ้าไม่มีวิธีอื่นเท่านั้น แต่ฉันต้องการที่จะแก้ปัญหาหรืออย่างน้อยก็หาสาเหตุของสิ่งนี้