Оперативная память (RAM): free, paging, swapping, commit/active/available

  • Отдельная статья про оперативную память
  • Отдельная статья про диски
  • Часть инфы из вебинара HonorCup E=DC2 для сдачи HCNA Storage
  • Core устройства (например, pe-роутеры) иногда падают из-за недостатка памяти по OOM (out of memory) с деградацией сервиса (например,падение BGP соседства)

DDR1/2/3/4
  • SDR -> DDR -> DDR2 -> DDR3 -> DDR4 – поколения ОП. С каждым поколением улучшалось быстродействие, повышался объем и уменьшалось энергопотребление.
  • Процессор может не поддерживать “старую” DDR3, например новый Xeon E5.
  • Udimm/rdimm/lrdimm – буферный чип. 32/63 lrdimm обычно меньше rdimm.

  • Находил в старых компах DDR-1 (DDR 333), такой олдскул 🙂
 Название модели: DDR 333 DIMM 256 Mb (16MX16)
Производитель: Kingmax
Технические характеристики:
Тип: DDR
Форм-фактор: DIMM
 Объем одного модуля: 256

Модули памяти DDR3 отличаются высокой пропускной способностью и при этом потребляют меньше энергии в сравнении с DDR2.

Channels

Память, установленная в материнку, может работать в одноканальном или двухканальном режиме (single mode/dual mode). В первом случае используется один контроллер памяти. Во втором случае – два. Прирост производительности во втором случае порядка 5-10%, но требуется совпадение параметров модуля: объем, частота работы, тайминги, вендор.

Пример корректного подключения двух одинаковых модулей в разные каналы (контроллеры):

ТИПЫ по буфферизации/потреблению питания

R – регистровая (буферизированная) память, для серверных мат. плат ((на Aliexpress поэтому пишется FOR SERVER ONLY)). На мат. платах без поддержки буферизированной памяти работать НЕ будет.  Например, в видосе чел менял платы оперативки 2G обычные на 16G с индексом R (6 модулей = 96 гигов поставил) – регистровые (в теории можно было бы 32 LR).

Регистровая память (registered, буферизованная, buffered) – вид оперативной памяти, модули которой содержат регистр между микросхемами памяти и контроллером памяти. Обычно используется в системах, требующих масштабируемости и отказоустойчивости. Наличие регистров уменьшает электрическую нагрузку на контроллер памяти, что позволяет устанавливать большее количество модулей памяти на один канал.

Если коротко, то регистровая память позволяет затолкать больше памяти в один канал, за счет меньшей нагрузки на контроллер. Например, ваш E5-1660 v4 ((проц)) поддерживает целых 1536 ГБ оперативки, и имеет для нее 4 канала памяти. Таким образом, на каждый канал можно навешать до 384ГБ, а для этого нужны модули по 64ГБ каждый. И если не использовать буфер, и не снижать электрическую нагрузку - то такой модуль сделать не получится, также, как и заставить его работать с другими такими же модулями. Даже более того - тут уже нужна не просто регистровая память, а нужна LRDIMM (со сниженной нагрузкой). Касательно вашего случая - у вас мат.плата поддерживает одинаковый объем независимо от типа памяти. Просто потому, что он достигается 8 обычными модулями по 16 ГБ каждый.

U – небуферизировання (не регистровая) память, для обычных мат. плат.

L – DDR3L обычная память DDR3, но с пониженным рабочим напряжением (1.35 вольта, против обычной DDR3 – 1.5 вольта).

LR – Load Reduced – такой памяти можно больше всего проинсталлировать (high density) за счет снижения нагрузки на шину памяти (поэтому Load Reduced). По brief review benchmark’а производительность таким модулей немного хуже Registered.

Short for load-reduced dual inline memory module. LRDIMM is a load-reduction (LR) DIMM (used in servers) that supports higher densities than RDIMMs and contains a memory buffer (MB) chip, as opposed to a register, in order to reduce and minimize the load on the server memory bus.

 

ECC

ECC (Error correction code) кратко (WIKI):

  • Задача повышение стабильности работы систем за счет проверки (реализуемо и non-ECC проверкой контроля четности; как CRC) и восстановления! дефектных данных (обычно 1 битый бит в машинном слове 64 бита), например, в результате действия электромагнитных интерференций/помех
    • В целом вероятность ошибки в памяти низка (исследования Google – от 25 000 до 70 000 за миллиард рабочих часов)
    • Но напр.
      • вероятность ошибки в памяти возрастает с высотой! из-за влияния космического излучения. Поэтому системы, работающие на большой высоте, требуют большей защиты (250 ошибок в день – норма в день, всплески до 1000 ошибок).
      • рост ошибок в памяти может говорить о том, что память скоро выйдет из строя. ECC коррекция может позволить при этом памяти какое-то время “продержаться” и что еще важнее – сигнализировать о проблеме счетчиком исправленных бит/слов (не всегда поддерживалось)
  • Коррекция ошибок – это математический процесс, который обеспечивает правильность данных, хранящихся в памяти. В случае ошибки ECC также позволяет системе в реальном времени воссоздать правильные данные. ECC генерирует 8 дополнительных бит на 64 бита данных. Система выполняет сложный математический алгоритм (чаще всего код Хэмминга) на дополнительных битах данных, чтобы гарантировать, что остальные 64 бита являются правильными. В случае, если один бит неверен (однобитовая ошибка), алгоритм ECC может восстановить данные. Однако при более крупных ошибках (два или более бит) такой алгоритм (чаще всего, но есть и “более устойчивые к ошибкам” реализации) может лишь уведомить систему.
  • ECC для серверных систем в основном используется
  • Для работы ECC требуется аппаратно:
    • на ECC памяти обычно присутствует дополнительный чип в сравнении с обычной памятью, собственно из-за этого чипа память и в основном дороже (порядка +30%)
    • память с поддержкой
    • совместимая материнская карта (контроллер памяти)
    • совместимый процессор (у Intel только Xeon)
  • ECC память чуть медленнее (0.5% – 3% на основе разных исследований)
 

 

 

Linux

Сортируем процессы по потреблению RAM.

ps -o pid,user,%mem,command ax | sort -b -k3 -r

Смотрим, какие планки ОП установлены в Linux систему, не вскрывая ее. И в каких банках (может глючить).

~# dmidecode --type 17 | grep Locator
Locator: DIMM_A1
Bank Locator: NODE 1

sev1# sudo dmidecode -t memory | grep Size Size: 4096 MB Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed Size: No Module Installed
sev2# sudo dmidecode -t memory | grep Size
Size: 16384 MB
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
sh-4.4# dmidecode -t memory | grep Size
Size: 4096 MB
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: 4096 MB
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed
Size: No Module Installed

sh-4.4# dmidecode | grep Bank
Bank Locator: NODE 1
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NODE 2
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM
Bank Locator: NO DIMM

 

RAMDISK

Пример usage для работы tcpdump с ramdisk:

# mkdir /tmp/ramdisk
# mount -t tmpfs -o size=1000m tmpfs /tmp/ramdisk/
# nice --adjustment=-10 tcpdump -s 1514 -i eth2 -w /tmp/ramdisk/ecg_sniffer_eth2_20180321.pcap 

 

Free

В контексте оперативной памяти есть понятие страниц – huge pages, page merging (USKM, который ускоряет использование RAM для CPU путем дедупликации памяти) и прочих вещей, связанных с pages.

Most current CPU architectures support bigger pages (so the CPU/OS have less entries to look-up), those are named Huge pages (on Linux), Super Pages (on BSD) or Large Pages (on Windows), but it all the same thing.

Free -h – утилита для просмотра занятости RAM, cache, SWAP памяти.

~$ free
             total       used       free     shared    buffers     cached
Память:     501644     492448       9196         84      14916     176676
-/+ буферы/кэш:     300856     200788
Swap:       522236     491192      31044

~$ free -h
             total       used       free     shared    buffers     cached
Mem:          2,0G       1,8G       205M        32K       141M       953M
-/+ buffers/cache:       700M       1,3G
Swap:         2,0G       561M       1,5G

Утилита free показывает именно доступную для использования память, а не весь её физический объём.

В Centos/RHEL если заглянуть в dmesg, можно увидеть следующие записи:

~$ dmesg|grep Reserving
[ 0.000000] Reserving 161MB of memory at 688MB for crashkernel (System RAM: 2047MB)
~$ dmesg|grep Memory
[ 0.000000] Memory: 1860532k/2097140k available (7348k kernel code, 400k absent, 236208k reserved, 6281k data, 1844k init)

То есть, часть памяти резервируется операционной системой под свои нужны (kdump) в самом начале загрузки, поэтому цифра во free получается несколько меньше, чем ожидается.

При базовом сценарии использования памяти (без i/o устройств которым для включения нужны большие непрерывные участки hardware memory, которые могут быть недоступны из-за фрагментации) в Linux полагаться надо на available или free + cached + buffered, когда available нет (менее точно т.к. не все участки cached+ buffered reclaimable/swappable из-за того, что они могут использоваться прямо сейчас). НЕЛЬЗЯ ПОЛАГАТЬСЯ ТОЛЬКО НА FREE.

При этом признаками утечки памяти (memory leak) могут быть два индикатора (особенно, если они сопряжены с уменьшением available памяти):

    • уменьшения тренда по available
    • рост commit (kbcommit) – более явно т.к. эта память не возвращается в систему до тех пор, пока она не будет освобождена при этом на практике free по memavaliable может считать, что занятая commit память доступна для системы и других процессов!
https://www.ciscolive.com/c/dam/r/ciscolive/us/docs/2018/pdf/BRKARC-3146.pdf
Memory Utilization Alarms
Committed memory > 95% for warnings
Committed memory > 99% for critical errors 
    • рост active (kbactive) – менее явно, но все равно крайне подозрительно т.к. она reclaime’ится в последнюю очередь
    • https://man7.org/linux/man-pages/man1/sar.1.html
      kbactive
                           Amount of active memory in kilobytes (memory that
                           has been used more recently and usually not
                           reclaimed unless absolutely necessary).
      kbcommit
                           Amount of memory in kilobytes needed for current
                           workload.  This is an estimate of how much RAM/swap
                           is needed to guarantee that there never is out of
                           memory.
https://www.linuxatemyram.com/
available - Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)

How do I stop Linux from doing this?

You can't disable disk caching. The only reason anyone ever wants to disable disk caching is because they think it takes memory away from their applications, which it doesn't! Disk cache makes applications load faster and run smoother, but it NEVER EVER takes memory away from them! Therefore, there's absolutely no reason to disable it!

How do I see how much free ram I really have?

To see how much ram your applications could use without swapping, run free -m and look at the "available" column:

$ free -m
 total     used        free      shared  buff/cache   available
Mem: 1504   1491          13     0         855      792
Swap: 2047    6        2041

(On installations from before 2016, look at "free" column in the "-/+ buffers/cache" row instead.)

This is your answer in MiB. If you just naively look at "used" and "free", you'll think your ram is 99% full when it's really just 47%!

To calculate free memory value with SAR, use the below formula:

kbmemfree + kbbuffers + kbcached = actual free memory on the system

Warning signs of a genuine low memory situation that you may want to look into:

- available memory (or "free + buffers/cache") is close to zero
- swap used increases or fluctuates

 

 

PAGING, SWAPPING

По сути PAGING и SWAPPING одно и то же – перемещение участков памяти из RAM на HDD/SSD. Даже в рамках одного предложения можно встретить использование и swapping и paging как одного, пример Oracle. При этом для современных ОС актуален термин paging. Swapping/paging – нежелательное для стабильной производительности приложения поведение системы и его нужно по возможности избегать – напр. отключать использование swapping (swappiness).

Swapping can have a significant impact on Coherence's performance and should be avoided. Often, swapping manifests itself as Coherence nodes being removed from the cluster due to long periods of unresponsiveness caused by them having been swapped out of RAM. See "Avoid using virtual memory (paging to disk)." for more information. To avoid swapping, ensure that sufficient RAM memory is available on the computer or that the number of running processes is accounted for and do not consume all the available RAM. Tools such as vmstat and top (on Unix and Linux) and taskmgr (on Windows) should be used to monitor swap rates.

Linux, by default, may choose to swap out a process or some of its heap due to low usage even if it is not running low on RAM. Swappiness is performed to be ready to handle eventual memory requests. Swappiness should be avoided for Coherence JVMs. The swappiness setting on Linux is a value between 0 and 100, where higher values encourage more optimistic swapping. The default value is 60. For Coherence, a lower value (0 if possible) should always be set.

echo 0 > /proc/sys/vm/swappiness

To set the value permanently, modify the /etc/sysctl.conf file as follows:
vm.swappiness = 0
Jan did a great job explaining in detail but if you just want a birds eye difference here is what each does notice the bold font to indicate the main difference.

Paging: is when individual memory segments, or pages, are moved to or from the swap area/swap partition

Swapping: is when entire processes were swapped and moved to or from the swap area/swap partition

Подкачка страниц (англ. paging; иногда используется термин swapping от swap/swɔp/) — один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (жёсткий диск или другой внешний накопитель, такой как флеш-память), освобождая ОЗУ для загрузки других активных фрагментов памяти. Такими фрагментами в современных ЭВМ являются страницы памяти.

Paging — это процесс, при котором Linux делит свою физическую оперативную память на куски фиксированного размера (4 КБ), называемые страницами (англ. «pages»).

Swapping (или «подкачка памяти») — это процесс, при котором страница памяти копируется в специальное пространство на жестком диске, называемое пространством подкачки (англ. «swap space»), освобождая занимаемый ею объем оперативной памяти. В Linux для этого существует специальная программа — менеджер памяти.
    • Каждый раз, когда системе требуется больше памяти, чем ей физически доступно в данный момент, менеджер памяти ищет все редко используемые страницы памяти и вытесняет их на жесткий диск, предоставляя освободившуюся память другому приложению (процессу).
    • Часто случается так, что приложение в момент своего старта задействует существенное количество страниц памяти, которые в дальнейшем ему больше не потребуются. В таких случаях операционная система также может произвести вытеснение подобных страниц памяти на диск, освободив тем самым память для других приложений (или даже для дискового кэша).
Создание SWAP раздела и его использование (на примере CentOS 7)

Если система должна одинаково быстро возвращать любые данные – SWAP лучше не использовать, а мониторить и расширять по данным мониторинга ОП.

Создал SWAP 2GB (по размеру RAM). Поправил права (чтобы только root мог прочитать содержимое), включил и добавил в автозагрузку. Проверил, что все ок (после перезагрузки).

~$ sudo dd if=/dev/zero of=/swapfile count=2048 bs=1MiB
[sudo] password for admin:
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 7.08322 s, 303 MB/s

~$ ls -lh /swapfile
-rw-r--r-- 1 root root 2.0G Mar 28 23:59 /swapfile

~$ sudo chmod 600 /swapfile

~$ ls -lh /swapfile
-rw------- 1 root root 2.0G Mar 28 23:59 /swapfile

~$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=772c8158-60d8-4877-a232-3b49d724f3d9

~$ sudo swapon /swapfile

~$ swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 0 -2

~$ free -m
total used free shared buff/cache available
Mem: 1837 568 76 88 1192 1017
Swap: 2047 0 2047

~$ sudo vi /etc/fstab
# add line
/swapfile swap swap sw 0 0

 

OOM – out of memory

Сталкивался с OOM при генерации левых процессов без таймаута.

Проблемы были довольно серьезные – перестала работать база и ряд скриптов, причем как ruby, так и sh. Мониторинг процессов это очень важно 🙂

Jun 19 10:37:05 tests kernel: [25790395.418410] Out of memory: Kill process 1335 (mysqld) score 48 or sacrifice child
Jun 19 10:37:05 tests kernel: [25790395.418625] Killed process 1335 (mysqld) total-vm:1344232kB, anon-rss:177676kB, file-rss:0kB
Jun 19 10:37:05 tests kernel: [25790395.551433] init: mysql main process (1335) killed by KILL signal
Jun 19 10:37:05 tests kernel: [25790395.551470] init: mysql main process ended, respawning

ip_monitoring.rb:9:in ``': Cannot allocate memory - grep 10.225.12.114 ' (Errno::ENOMEM)


sql-oracle_sync.rb:19:in ``': Cannot allocate memory - curl "http://localhost:1301/cgi-bin/sendsms?

Leave a Reply