(no subject)

May 01, 2017 17:51

    Выяснилось, что я плохо определил для себя, что является фундаментальнымы знаниями backend программиста на C/C++ (не для встраиваемых систем).

К примеру, имеем код:

typedef int myint_t;
size_t sz = 2*1024*1024;
size_t pg = (size_t)pagesize();
char * t;
char * p = (char*)malloc(sz);
if (p == NULL)
return;
for(t=p;t+sizeof(myint_t)-p

Что в нём может быть плохого и/или опасного?

    Так вот, «man malloc» надо перечитывать регулярно; раз в 10-15 лет.

By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. In case it turns out that the system is out of memory, one or more processes will be killed by the OOM killer.

Normally, malloc() allocates memory from the heap, and adjusts the size of the heap as required, using sbrk(2). When allocating blocks of memory larger than MMAP_THRESHOLD bytes, the glibc malloc() implementation allocates the memory as a private anonymous mapping using mmap(2). MMAP_THRESHOLD is 128 kB by default, but is adjustable using mallopt(3).

Вот этого optimistic я и не помнил.

Т.е. выделяя 2 мегабайт в коде, мы будем выделять память не sbrk(), а скорее всего, mmap()-ом. В коде мы будем «пачкать» страницы очень быстро. Если мы рассмотрим современную Linux систему, сконфигурированную для in-memory, то paging space у неё меньше RAM. И есть шанс, что во время этого «пачкания страниц», out-of-memory killer начнёт убивать. В хорошем варианте он убьёт нас. В плохом - грохнутся кернелевские thread-ы. Плохой пример я наблюдал: swap организован был через network block device, и система грохалась. Я не успевал увидеть, как swap используется. Доступа к гипервизору и логам у меня не было, и я полез в сорсы кернеля... Там видно, что для I/O@NBD нужно ещё немножечко памяти. А её не было...

Это, конечно же, спекуляции; я не мог проверить свою идею. Даже как точно сконфигурирован NBD, я не смог понять за время, которое было выделено. Но просто переопределив swap не через напрямую-к-NBD (в моём случае стало: swap-over-file-FS-over-NBD) привело к устойчивой системе.

Если искать по OOM в LJ, то можно найти вот это: http://jp-larocque.livejournal.com/32694.html

lytdybr, computers, programming

Previous post Next post
Up