วิธีการค้นหาสิ่งที่ใช้แลกเปลี่ยน linux หรือสิ่งที่อยู่ในการแลกเปลี่ยน?


12

ฉันมีเซิร์ฟเวอร์ 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? มีวิธีใดบ้างที่จะ "แลกเปลี่ยนข้อมูล" เพื่อดูว่ามีอะไรเกิดขึ้นจริงในนั้นแทนที่จะรวมการใช้ประโยชน์จากการแลกเปลี่ยนจากกระบวนการทั้งหมดหรือไม่

เมื่อวิเคราะห์ปัญหาฉันพบความคิดที่แตกต่างกัน แต่พวกเขาทั้งหมดดูเหมือนจะผิด:

  1. เอาต์พุตสคริปต์ไม่ได้อยู่ในหน่วย KB แม้ว่ามันจะอยู่ในหน่วย 512 หรือ 4KB มันจะไม่ตรงกัน ที่จริงแล้วอัตราส่วน (1200: 440) นั้นประมาณ 3: 1 ซึ่งเป็นตัวเลข "แปลก"
  2. มีบางหน้าในการแลกเปลี่ยนที่ใช้ร่วมกันอย่างใดระหว่างกระบวนการดังกล่าวในมี/server//a/477664/98204 หากเป็นจริงฉันจะค้นหาจำนวนหน่วยความจำที่ใช้จริงเช่นนี้ได้อย่างไร ฉันหมายความว่ามันจะต้องสร้างความแตกต่าง cca 800MB และนั่นไม่ได้เสียงที่เหมาะสมในสถานการณ์นี้
  3. มีหน้า "เก่า" บางส่วนในการแลกเปลี่ยนที่ใช้โดยกระบวนการที่เสร็จสิ้นไปแล้ว ฉันจะไม่คิดว่าถ้าฉันสามารถหาการแลกเปลี่ยน "ฟรี" นี้ได้เท่าไหร่
  4. มีหน้าในการแลกเปลี่ยนที่ได้รับการสลับกลับไปยังหน่วยความจำและอยู่ในการแลกเปลี่ยนเพียงในกรณีที่พวกเขาไม่ได้มีการเปลี่ยนแปลงใน RAM และจะต้องมีการสลับออกมาอีกครั้งตามที่กล่าวไว้ในที่มี /server//a/100636/98204 แต่ค่า SwapCached มีเพียง 24MB

สิ่งที่แปลกคือการใช้ swap เพิ่มขึ้นอย่างช้าๆในขณะที่ผลรวมจากสคริปต์นั้นค่อนข้างเหมือนกัน ใน 3 วันที่ผ่านมาการแลกเปลี่ยนที่ใช้เพิ่มขึ้นจาก 1100MB เป็น 1230MB ปัจจุบันในขณะที่ผลรวมเพิ่มขึ้นจาก 430MB เป็น 449MB ปัจจุบัน (แคลิฟอร์เนีย)

เซิร์ฟเวอร์มี RAM (สามารถ) ว่างได้เพียงพอดังนั้นฉันจึงสามารถปิดการแลกเปลี่ยนและเปิดอีกครั้ง หรือฉันอาจตั้งค่า swappiness เป็น 0 ดังนั้นการแลกเปลี่ยนจะได้ใช้ถ้าไม่มีวิธีอื่นเท่านั้น แต่ฉันต้องการที่จะแก้ปัญหาหรืออย่างน้อยก็หาสาเหตุของสิ่งนี้


เหมือนที่คุณพูดว่าคุณควรตั้งค่า vm.swappiness = 0 (หรือ 1) และ swapoff && swapon
HTTP500

แต่นั่นจะไม่แก้ปัญหา ฉันสมมติว่าการแลกเปลี่ยนจะเริ่มเพิ่มขึ้นอีกครั้งถ้าฉันตั้ง swappines กลับไปที่ 60 หรือจะไม่ถูกใช้เลยถ้าฉันเก็บไว้ที่ 0 หรือ 1 (เว้นแต่เซิร์ฟเวอร์ออกจากหน่วยความจำ)
Radek Hladík

หากเป็นเซิร์ฟเวอร์ DB ควรใช้ swap ในกรณีฉุกเฉินเท่านั้นดังนั้นคุณควรตั้งเป็น 0 (หรือ 1)
HTTP500

นั่นเป็นเรื่องจริงและนั่นอาจเป็นสิ่งที่ฉันจะทำถ้าฉันไม่พบสาเหตุของปัญหานี้ ... ในทางกลับกันมีฐานข้อมูลขนาดเล็กจำนวนมากบนเซิร์ฟเวอร์ที่ใช้เป็นระยะ ๆ และฉันชอบความคิดของพวกเขา เปลี่ยนเป็นระบบเมื่อพวกเขาไม่ได้ใช้ ... แต่ฉันคิดว่า MySQL จะสามารถจัดการได้ด้วยตัวเอง ...
Radek Hladík

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

คำตอบ:


9

Fedora 18 ขึ้นไปมีsmemใน repos คุณสามารถดาวน์โหลดสคริปต์หลามและติดตั้งจากแหล่งที่มา

นี่คือผลลัพธ์ตัวอย่าง (ค่อนข้างถูกตัดและไม่เปิดเผยชื่อ) จากเครื่องของฉัน:

# smem -s swap -t -k -n
  PID User     Command                         Swap      USS      PSS      RSS 
20917 1001     bash                               0     1.1M     1.1M     1.9M 
28329 0        python /bin/smem -s swap -t        0     6.3M     6.5M     7.4M 
 2719 1001     gnome-pty-helper               16.0K    72.0K    73.0K   516.0K 
  619 0        @sbin/mdadm --monitor --sca    28.0K    72.0K    73.0K   248.0K 

[big snip]

32079 42       gnome-shell --mode=gdm         41.9M     1.9M     2.0M     5.0M 
32403 1001     /opt/google/chrome/chrome -    43.1M   118.5M   119.4M   132.3M 
 4844 1002     /opt/google/chrome/chrome      48.1M    38.1M    41.9M    51.9M 
 5411 1002     /opt/google/chrome/chrome -    54.6M    33.4M    33.5M    36.8M 
 5624 1002     /opt/google/chrome/chrome -    72.4M    54.9M    55.5M    65.7M 
24328 1002     /opt/Adobe/Reader9/Reader/i    77.5M     1.9M     2.0M     5.2M 
 4921 1002     /opt/google/chrome/chrome -   147.2M   258.4M   259.4M   272.0M 
-------------------------------------------------------------------------------
  214 14                                       1.1G     1.1G     1.2G     1.7G 

แหล่งที่มายังให้ข้อมูลsmemcapที่จะเก็บข้อมูลที่เกี่ยวข้องทั้งหมดเพื่อให้สามารถเรียกใช้ smem ได้ในภายหลัง

   To  capture  memory statistics on resource-constrained systems, the the
   smem source includes a utility named  smemcap.   smemcap  captures  all
   /proc entries required by smem and outputs them as an uncompressed .tar
   file to STDOUT.  smem can analyze the output using the --source option.
   smemcap is small and does not require Python.

1
Smem จาก F17 repo ไม่ทำงาน (แสดงรายการที่ว่างเปล่า) แต่อันที่มาจากแหล่งที่ทำงานและแสดงตัวเลขเกือบเหมือนกันกับคนอื่น ๆ :-) mysql 358.1M จากทั้งหมด 392.6M ในขณะที่ด้านบนแสดง 1191224k ที่ใช้
Radek Hladík

4

คุณควรตรวจสอบสคริปต์นี้ในเครื่องอื่นเนื่องจากระบบของฉันแสดงการใช้ swap ที่ถูกต้อง:

# Your_script.sh
111280   Total Swap Used
# free
Swap:     33551716     120368   33431348

อยู่ใกล้มาก 111280 ~ = 120368

ดูสคริปต์นี้ด้วย:

สำหรับ proc ใน / proc / *; do cat $ proc / smaps 2> / dev / null | awk '/ Swap / {swap + = $ 2} END {พิมพ์ swap "\ t' readlink $proc/exe'"}'; เสร็จสิ้น เรียง -n | awk '{total + = $ 1} / [0-9] /; END {จำนวนการพิมพ์ "\ tTotal"}'

จากหัวข้อนี้:

/unix/71714/linux-total-swap-used-swap-used-by-processes


สคริปต์ที่กล่าวถึงนั้นกลับมาผลลัพธ์เหมือนเดิม ... 364920 / usr / libexec / mysqld 400372 รวม
Radek Hladík

เมื่อฉันลองสคริปต์บนเซิร์ฟเวอร์อื่น ๆ ที่มีการใช้งาน swap ต่ำมาก (50MB) มันรายงาน cca 72MB โดยรวม :-) ฉันจะต้องจำลองมันบนเซิร์ฟเวอร์ที่ไม่มีการผลิตในภายหลัง ...
Radek Hladík
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.