kswapd0 берет много процессора

24

kswapd0 берет 99,9% моего процессора, поскольку топ показывает мне, проблема появилась сегодня, когда игра и первый раз она ушла через 6 минут, и теперь она делает это около 20 минут. Как это исправляется и что вызывает это?

    
задан Kaspar 22.02.2013 в 13:32
источник

2 ответа

24

Процесс kswapd0 - это процесс, который управляет виртуальной памятью. Ваша машина должна «иметь» RAM, SWAP и EXT4 на вашем HDD / SSD. Ext4 - это место, где все хранится, и он всегда медленнее, чем RAM. Оперативная память - это как полпути для программ для быстрого доступа к информации. На большинстве компьютеров имеется не менее 4 ГБ оперативной памяти, что при обычных условиях достаточно. Однако, если вы играете в игру, вы можете бежать в пространстве RAM, где находится SWAP.

SWAP - это поддельная оперативная память, расположенная на вашем HDD / SSD рядом с вашим EXT4. Он быстрее доступен, чем EXT4, но он намного медленнее, чем реальная оперативная память. Когда вы запускаете низкую память, kswapd0 перемещает программы, которые вы не используете / не используете столько же, сколько другие программы для SWAP, что вызывает крайнее отставание в этих процессах. Если ваша игра нуждалась в 5 ГБ оперативной памяти, 1 ГБ на LEAST будет в SWAP. Это означает, что когда он пытается получить доступ к этой информации, ей приходится ждать дольше, чтобы получить ее.

Весь этот процесс вызывает чрезмерное использование ЦП, перемещение информации из и в SWAP и ОЗУ и одновременное обращение с запросом информации. Как решить эту проблему?

  1. Скажите kswapd0 только перемещать вещи в SWAP, когда вы полностью вне ОЗУ. Это самый эффективный метод решения проблем SWAP. Выполнить

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

    где 0 - процент, оставшийся без 100 , при котором должен использоваться SWAP (когда у вас осталось 0% ОЗУ, SWAP начнет принимать данные). Вы также можете просто отредактировать /etc/sysctl.conf по своему вкусу, а не добавлять эту команду до конца каждый раз, используя gedit или nano или что-то еще, не забудьте, однако, sudo, но этот файл принадлежит root. Перезагрузитесь и ваши настройки!

  2. Уменьшите потребление ОЗУ другими процессами или закройте другие программы во время работы с программами высокой памяти. Вот почему большинство игр говорят вам закрыть все остальные окна перед игрой, или установки делают то же самое. Такие вещи, как службы синхронизации файлов, как правило, занимают много памяти.
  3. Купите больше оперативной памяти. Установка ОЗУ не так сложна, как кажется. Один или два винта на небольшом отсеке (если вы на ноутбуке) и простой щелчок. Просто убедитесь, что вы покупаете правильный вид!
  4. Более низкие процессы процессора так же, как и с ОЗУ. Это поможет ускорить работу ОЗУ с пакетами SWAP.

Это лучшее, что вы можете сделать. Другие могут сказать, что отключить своп полностью, но это опасно, и я бы не рекомендовал этого. Это может привести к зависанию целых систем, если есть утечка памяти или слишком много запущенных приложений. Просто поймите, что SWAP является отказоустойчивым для ОЗУ. Это определенно не так быстро или эффективно, как оперативная память, но это лучше, чем Windows-файл! (который выполняет ту же цель)

EDIT: Если вы хотите узнать больше о SWAP, см. здесь .

    
ответ дан Zzzach... 30.09.2014 в 18:37
источник
21

kswapd0 работает на 99,9% от одного процессора, но на самом деле не заменяет вообще

Мне это случается порой на 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 часто использует 100% CPU при использовании 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 (см. комментарий к его ответ , Как мне изменить" / sys / kernel / mm / transparent_hugepage / enabled " и справочное руководство 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

16.04 14.04 своп

    
ответ дан Martin Rüegg 20.02.2016 в 11:09