Я не уверен на 100%, но в зависимости от того, какая у вас материнская плата, MD-драйвер в линуксе может пытаться собрать массив сам, и в результате накручивать конфигурацию, сделанную прошивкой (Если это интегрированный в МБ, это почти никогда не аппаратный RAID, и обычно он делается в прошивке ). Кроме того, если это более новая материнская плата Intel, то режим «RAID» контроллера хранилища не поддерживается в Linux (, этот режим в основном существует для того, чтобы позволить Windows легко настроить RAID, а также обойти плохую конфигурацию управления питанием Microsoft в их драйвер AHCI ).
Помимо всего этого, как правило, вы почти наверняка захотите использовать программный RAID, а не встроенный RAID, когда имеете дело с чем-либо, кроме Windows. Проблема, которую вы видите, является одной из причин этого, но другие серьезные:
Если вам необходимо заменить материнскую плату, вы можете потерять конфигурацию RAID (либо из-за того, что микропрограмма хранит ее в NVRAM, либо из-за того, что новый MB не поддерживает ту же реализацию RAID ).
По крайней мере, с программным RAID (при использовании LVM, который, как я полагаю, является предпочтительным методом в Ubuntu ), вы можете легче обрабатывать сбои устройств в режиме онлайн, а также лучше контролировать, как они обрабатываются.
В /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 кажется более пуленепробиваемым -.