Недостаточно памяти, но доступна подкачка

Я не уверен на 100%, но в зависимости от того, какая у вас материнская плата, MD-драйвер в линуксе может пытаться собрать массив сам, и в результате накручивать конфигурацию, сделанную прошивкой (Если это интегрированный в МБ, это почти никогда не аппаратный RAID, и обычно он делается в прошивке ). Кроме того, если это более новая материнская плата Intel, то режим «RAID» контроллера хранилища не поддерживается в Linux (, этот режим в основном существует для того, чтобы позволить Windows легко настроить RAID, а также обойти плохую конфигурацию управления питанием Microsoft в их драйвер AHCI ).

Помимо всего этого, как правило, вы почти наверняка захотите использовать программный RAID, а не встроенный RAID, когда имеете дело с чем-либо, кроме Windows. Проблема, которую вы видите, является одной из причин этого, но другие серьезные:

  • Если вам необходимо заменить материнскую плату, вы можете потерять конфигурацию RAID (либо из-за того, что микропрограмма хранит ее в NVRAM, либо из-за того, что новый MB не поддерживает ту же реализацию RAID ).

  • По крайней мере, с программным RAID (при использовании LVM, который, как я полагаю, является предпочтительным методом в Ubuntu ), вы можете легче обрабатывать сбои устройств в режиме онлайн, а также лучше контролировать, как они обрабатываются.

12
19.07.2020, 12:22
1 ответ

В /proc/meminfoвы найдете:

CommitLimit:    1551056920 kB
Committed_AS:   1549560424 kB

Итак, вы достигли предела фиксации.

Если вы отключили перераспределение памяти (, чтобы избежать OOM -killer)by:

echo 2 > /proc/sys/vm/overcommit_memory

Затем предел фиксации вычисляется как:

2   -   Don't overcommit. The total address space commit
        for the system is not permitted to exceed swap + a
        configurable amount (default is 50%) of physical RAM.
        Depending on the amount you use, in most situations
        this means a process will not be killed while accessing
        pages but will receive errors on memory allocation as
        appropriate.

(Из:https://www.kernel.org/doc/Documentation/vm/overcommit-accounting)

Вы можете использовать всю память,:

echo 100 > /proc/sys/vm/overcommit_ratio

Затем вы получите -из -памяти, когда вся физическая оперативная память и подкачка зарезервированы.

Имя overcommit_ratioв данном случае немного вводит в заблуждение. :Вы ничего не переусердствуете.

Даже с этой настройкой вы можете увидеть -из -памяти до того, как своп будет исчерпан. malloc.c:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <unistd.h>

void main(int argc, char **argv) {
  long bytes, sleep_sec;
  if(argc != 3) {
    printf("Usage: malloc bytes sleep_sec\n");
    exit(1);
  }
  sscanf(argv[1],"%ld",&bytes);
  sscanf(argv[2],"%ld",&sleep_sec);
  printf("Bytes: %ld Sleep: %ld\n",bytes,sleep_sec);
  if(malloc(bytes)) {
    sleep(sleep_sec);
  } else {
    printf("Out of memory\n");
    exit(1);
  }
}

Скомпилировать как:

gcc -o malloc malloc.c

Запустить как (зарезервировать 1 ГБ на 10 секунд):

./malloc 1073741824 10

Если вы запустите это, вы можете увидеть OOM, даже если своп свободен:

# Plenty of ram+swap free before we start
$ free -m
              total        used        free      shared  buff/cache   available
Mem:         515966        2824      512361          16         780      511234
Swap:       1256720           0     1256720

# Reserve 1.8 TB
$./malloc 1800000000000 100 &
Bytes: 1800000000000 Sleep: 100

# It looks as if there is plenty of ram+swap free
$ free -m
              total        used        free      shared  buff/cache   available
Mem:         515966        2824      512361          16         780      511234
Swap:       1256720           0     1256720

# But there isn't: It is all reserved (just not used yet)
$ cat /proc/meminfo |grep omm
CommitLimit:    1815231560 kB
Committed_AS:   1761680484 kB

# Thus this fails (as you would expect)
$./malloc 180000000000 100
Bytes: 180000000000 Sleep: 100
Out of memory

Таким образом, несмотря на то, что freeна практике часто поступают правильно, рассмотрение CommitLimit и Committed _AS кажется более пуленепробиваемым -.

20
18.03.2021, 23:18

Теги

Похожие вопросы