kswapd0 ใช้ซีพียูจำนวนมาก


45

kswapd0 ใช้ซีพียูของฉัน 99.9% แสดงให้ฉันเห็นปัญหาที่เกิดขึ้นในวันนี้เมื่อเล่นเกมและครั้งแรกมันหายไปหลังจาก 6 นาทีและตอนนี้มันทำมาแล้วประมาณ 20 นาที สิ่งนี้แก้ไขได้อย่างไรและอะไรเป็นสาเหตุของปัญหานี้


สิ่งนี้เกิดขึ้นกับฉันใน Ubuntu 14.04 เช่นกัน
eri0o

สิ่งนี้เกิดขึ้นกับฉันในราคา 18.04 เช่นกัน รายละเอียดที่นี่: askubuntu.com/questions/1118932/…
Yuvraj Jaiswal

คำตอบ:


48

กระบวนการ kswapd0 เป็นกระบวนการที่จัดการหน่วยความจำเสมือน เครื่องของคุณควรมี RAM, SWAP และ EXT4 บน HDD / SSD ของคุณ ext4 นั้นเป็นที่เก็บทุกสิ่งและเข้าถึงได้ช้ากว่า RAM เสมอ RAM เปรียบเสมือนพื้นที่ทำงานครึ่งทางสำหรับโปรแกรมในการเข้าถึงข้อมูลอย่างรวดเร็ว คอมพิวเตอร์ส่วนใหญ่มี RAM อย่างน้อย 4GB ซึ่งภายใต้เงื่อนไขปกติมีมากมาย อย่างไรก็ตามเมื่อเล่นเกมคุณอาจมีพื้นที่ RAM เหลือน้อยซึ่งเป็นที่ที่ SWAP เข้ามา

SWAP เป็น RAM ปลอมที่อยู่บน HDD / SSD ถัดจาก EXT4 ของคุณ เข้าถึงได้เร็วกว่า EXT4 แต่จะช้ากว่า RAM จริงมาก เมื่อคุณใช้หน่วยความจำเหลือน้อย kswapd0 จะย้ายโปรแกรมที่คุณไม่ได้ใช้ / ไม่ได้ใช้งานมากเท่ากับโปรแกรมอื่น ๆ ไปยัง SWAP ซึ่งทำให้เกิดความล่าช้าอย่างมากต่อกระบวนการเหล่านั้น หากเกมของคุณต้องการ RAM 5GB, 1GB ที่ LEAST จะเป็น SWAP หมายความว่าเมื่อพยายามเข้าถึงข้อมูลนั้นจะต้องรออีกต่อไป

กระบวนการทั้งหมดนี้ทำให้เกิดการใช้งาน CPU สูงการย้ายข้อมูลจากและไปยัง SWAP และ RAM และจัดการการร้องขอข้อมูลทั้งหมดในเวลาเดียวกัน วิธีแก้ปัญหานี้

  1. บอก kswapd0 ให้ย้ายสิ่งต่าง ๆ ไปที่ SWAP เมื่อคุณไม่ได้ใช้ RAM หมด นี่เป็นวิธีที่มีประสิทธิภาพสูงสุดในการแก้ไขปัญหา SWAP วิ่ง

    echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf

    โดยที่0เปอร์เซ็นต์ที่เหลือจากการ100ที่ SWAP ควรใช้ (เมื่อคุณเหลือ RAM 0% SWAP จะเริ่มรับข้อมูล) นอกจากนี้คุณยังสามารถแก้ไข /etc/sysctl.conf ตามที่คุณต้องการแทนการเพิ่มคำสั่งนี้ไปยังจุดสิ้นสุดของมันทุกครั้งโดยใช้ gedit หรือ nano หรืออะไรก็ตามให้แน่ใจว่า sudo ว่าไฟล์นี้เป็นเจ้าของราก รีบูตเครื่องและตั้งค่าของคุณแล้ว!

  2. ลดการใช้ RAM โดยกระบวนการอื่นหรือปิดโปรแกรมอื่น ๆ ในขณะที่เรียกใช้โปรแกรมหน่วยความจำสูง นี่คือเหตุผลที่เกมส่วนใหญ่บอกให้คุณปิดหน้าต่างอื่น ๆ ทั้งหมดก่อนที่จะเล่นหรือการติดตั้งทำได้เหมือนกัน สิ่งต่างๆเช่นบริการซิงค์ไฟล์มักจะใช้หน่วยความจำมาก
  3. ซื้อ RAM เพิ่มเติม การติดตั้ง RAM นั้นไม่ยากอย่างที่คิด หนึ่งหรือสองสกรูในช่องเล็ก ๆ (ถ้าคุณใช้แล็ปท็อป) และคลิกง่าย เพียงให้แน่ใจว่าคุณกำลังซื้อชนิดที่ถูกต้อง!
  4. ลดการประมวลผลของ CPU ได้มากเท่ากับที่คุณทำกับ RAM สิ่งนี้จะช่วยให้ RAM ไปที่ SWAP เหล่านั้นระเบิดได้เพื่อความราบรื่นยิ่งขึ้น

นั่นคือสิ่งที่ดีที่สุดที่คุณสามารถทำได้ คนอื่น ๆ อาจบอกว่าปิดการใช้งาน swap อย่างสมบูรณ์ แต่นั่นเป็นอันตรายและฉันจะไม่แนะนำให้ทำเช่นนั้น ซึ่งอาจทำให้ทั้งระบบหยุดทำงานหากมีหน่วยความจำรั่วหรือแอปพลิเคชั่นทำงานมากเกินไป เพิ่งรู้ว่า SWAP นั้นไม่ปลอดภัยสำหรับ RAM แน่นอนว่ามันไม่เร็วหรือมีประสิทธิภาพเท่าแรม แต่มันดีกว่า Window's Pagefile! (ซึ่งบรรลุวัตถุประสงค์เดียวกัน)

แก้ไข: ถ้าคุณมีความสนใจในการเรียนรู้เพิ่มเติมเกี่ยวกับการ SWAP ดูที่นี่


ฉันจำไม่ได้ว่าสิ่งใดที่แก้ไขปัญหาให้ฉันได้อีกต่อไป แต่ฉันขอขอบคุณสำหรับคำตอบที่เขียนได้ดีซึ่งอธิบายได้มาก
Kaspar

ตามคำตอบของคุณฉันยุติกระบวนการบางอย่างเพื่อให้มีการแลกเปลี่ยนน้อยลง ตอนนี้กระบวนการkwapd0จะหายไป ขอบคุณ
mtoloo

28

kswapd0 ทำงานที่ 99.9% ของ CPU ตัวหนึ่ง แต่จริงๆแล้วมันไม่ได้แลกเปลี่ยนเลย

สำหรับฉันมันเกิดขึ้นในบางครั้งบน Ubuntu 14.04 ที่มีเคอร์เนล 3.19.0-50-generic (และรุ่นก่อนหน้า) ที่ทำงานใน VMware vm ฉันไม่มีเงื่อนงำอะไรทำให้มันปรากฏขึ้น แต่มันมาในช่วงเวลาว่าง

top แสดงให้เห็นว่า:

# top
top - 09:49:35 up 5 days, 18:35,  1 user,  load average: 1.00, 1.00, 0.99
Tasks: 219 total,   2 running, 217 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us, 25.0 sy,  0.0 ni, 74.7 id,  0.2 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem:   3028784 total,  1874468 used,  1154316 free,  1010276 buffers
KiB Swap: 15624188 total,     3032 used, 15621156 free.   234928 cached Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    52 root      20   0       0      0      0 R  99.7  0.0 122:15.21 kswapd0
     3 root      20   0       0      0      0 S   0.3  0.0   0:29.86 ksoftirqd/0
     7 root      20   0       0      0      0 S   0.3  0.0   9:49.47 rcu_sched

ทางออกชั่วคราว

รีบูตแก้ไขปัญหาได้ชั่วคราว

ทำตามคำตอบในserverfault (kswapd มักจะใช้ CPU 100% เมื่อมีการใช้งาน swap)ซึ่งมีการตั้งค่าเดียวกันในระบบของฉัน:

# cat /proc/sys/vm/swappiness
60
# cat /proc/sys/vm/vfs_cache_pressure
100
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

การแก้ปัญหาเป็นจริง# echo 1 > /proc/sys/vm/drop_caches:

# cat /proc/sys/vm/drop_caches
0
# echo 1 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
1

ตอนนี้มันไม่เป็นไร:

# top
top - 10:08:58 up 5 days, 18:55,  1 user,  load average: 0.72, 0.95, 0.98
Tasks: 220 total,   1 running, 219 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   3028784 total,   681704 used,  2347080 free,     2916 buffers
KiB Swap: 15624188 total,     3032 used, 15621156 free.    81924 cached Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
     9 root      20   0       0      0      0 S   0.3  0.0  14:10.40 rcuos/0
     1 root      20   0   45652   8124   2888 S   0.0  0.3   1:54.98 init

วิธีแก้ปัญหาแบบถาวร (จะพบ)?

แต่เนื่องจากเหตุผลที่แท้จริงยังไม่เป็นที่รู้จักและฉันไม่ได้อธิบายคำอธิบายใด ๆ ที่เหมาะสมในเน็ตนี่ไม่ใช่วิธีแก้ปัญหาถาวร ที่จริงแล้วคำตอบที่เลือกอาจเป็นคำตอบที่ถาวร ฉันแค่อยากจะเพิ่มสิ่งนี้เพื่อการอ้างอิงในอนาคตเนื่องจากการรีบูต (เพื่อให้ sysctl มีผล) ไม่สามารถทำได้เสมอไป

วิธีการแก้ปัญหาอื่น ๆ ที่อาจจะมีการตั้งค่า THP อย่างใดอย่างหนึ่งmadviceหรือnever(ดูpoige ของความคิดเห็นของเขาคำตอบ , ฉันจะแก้ไขวิธีการ“sys / kernel / / mm / transparent_hugepage / เปิดใช้งาน”และอ้างอิง MongoDB คู่มือการใช้งานในการปิดการใช้งานหน้าขนาดใหญ่ใส (THP) )

งาน cron

ฉันได้ตั้งค่าแบทช์ต่อไปนี้เป็นงาน cron เป็นโซลูชัน "ถาวร":

#!/bin/bash


## run as cron, thus no $PATH, thus need to define all absolute paths
top=/usr/bin/top
grep=/bin/grep


top=$($top -bn1 -o \%CPU -u0 | $grep -m2 -E "%CPU|kswapd0")

IFS='
'
set -f

i=0

for line in $top
do
        #echo $i $line

        if ! (( i++ ))
        then
                pos=${line%%%CPU*}
                pos=${#pos}
                #echo $pos
        else
                cpu=${line:(($pos-1)):3}
                cpu=${cpu// /}
                #echo $cpu
        fi

done

[[ -n $cpu ]] && \
(( $cpu >= 90 )) \
&& echo 1 > /proc/sys/vm/drop_caches \
&& echo "$$ $0: cache dropped (kswapd0 %CPU=$cpu)" >&2 \
&& exit 1

exit 0

เรียกใช้ด้วย

# m h  dom mon dow   command
  * *  *   *   *     /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1


คำตอบที่ดีมากขอบคุณ เคอร์เนล RPi ได้รับการปรับปรุงและนี่คือสิ่งที่ฉันได้รับ
พอล B

ขอบคุณ @PaulB ฉันได้เพิ่มคำตอบลงในงาน cron ที่ฉันใช้เป็นโซลูชันถาวรในระบบของฉัน
Martin Rüegg

ตามที่ระบุไว้อย่างถูกต้องโดย@Vegerสิ่งนี้สามารถใช้งานได้กับ 16.04 อย่างที่ฉันใช้อยู่ในปัจจุบัน ดังนั้นเพิ่มแท็ก ขอบคุณ!
Martin Rüegg

ขอขอบคุณอีกครั้ง@Veger ! - ฉันแก้ไขเครื่องหมายอัศเจรีย์ที่ขาดหายไปใน Sha-Bang ของสคริปต์แล้ว
Martin Rüegg

1
"echo 1> / proc / sys / vm / drop_caches" แก้ไขการใช้งาน CPU สูงสำหรับฉัน - ความแตกต่างทั้งกลางวันและกลางคืน! kswapd0 เพิ่มจาก CPU 100% เป็น 0% คำอธิบายสำหรับสาเหตุและวิธีแก้ปัญหาแบบถาวรจะดีมาก (หมายเหตุด้านข้าง: ฉันใช้เคอร์เนล linux 4.8.0-36-generic พร้อม 16 GB mem และ 16 GB swap)
josephdpurcell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.