У меня есть 24-ядерный сервер с 64 ГБ DRAM, и он работает под управлением Ubuntu Server 15.10. У меня странное поведение при подкачке и использовании физической памяти. У меня никогда не было этой проблемы, пока я не обновил Ubuntu до 15.10.
Вы можете увидеть мою проблему вверху:
top - 18:52:09 up 1 day, 2:25, 3 users, load average: 1.64, 1.30, 1.18
Tasks: 525 total, 2 running, 523 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 1.3 sy, 0.0 ni, 97.0 id, 1.4 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 65937528 total, 37526160 used, 28411368 free, 14396 buffers
KiB Swap: 67071996 total, 67071724 used, 272 free. 104304 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
363 root 20 0 0 0 0 R 100.0 0.0 324:02.98 kswapd0
6725 theosib 20 0 99.398g 0.034t 8920 D 12.0 55.1 59:08.71 common_shell_ex
В систему вошел один пользователь (я), и у меня есть один процесс, использующий большой объем виртуальной памяти. Однако что-то ограничивает его примерно половиной физической памяти, в то время как раздел подкачки в основном заполнен. Я наблюдал за работой этих процессов (компилятор дизайна Synopsys), и они не превышают отметку 50%, пока не заполнится своп. И еще одна странность в том, что kswapd0 использует очень высокий (обычно 100%) процессор. AFAIK, kswapd0 должен быть привязан к вводу-выводу и, следовательно, не использовать много процессорного времени.
Я посмотрел, были ли наложены какие-либо ограничения, но ulimit говорит иначе:
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 257447
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 257447
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Я также пробовал установить swappiness на 10, но это не помогло.
Может ли кто-нибудь помочь мне разобраться, почему эта система плохо себя ведет?
24-ядерный сервер почти наверняка означает двойной сокет, так что вы почти наверняка столкнетесь с NUMA ограничения - ядро не позволяет вам использовать память, назначенную другому сокету, если это не абсолютно нужно. Передача данных между сокетами - это много, много медленнее, чем доступ к нему из ОЗУ на том же сокете, и обычно останавливает оба сокета, поэтому его следует зарезервировать только в самых ужасных обстоятельствах.
То, что вы не использовали его в более ранних выпусках Ubuntu, вероятно, просто потому, что ядро улучшило обработку NUMA где-то между выпусками.