Суть проблеммы наверно более широкая,чем просто программирование.
Имеем относительно хороший компьютер - оперативная память 1Gb, ОС - FreeBSD 5.4, для swap выделен раздел размером 2Gb.
Пишу программу на C++. пока программа помещается в оперативной памяти - все нормально,
но как только она пытается выделить себе еще памяти, за пределами оперативной, - вылетает с исключением Core Dump.
Таким образом получается, что программа не может частично находится в оперативной памяти, а частично в swap?
Можно ли решить данную проблемму?
Причем проблемма касается не только нашей программы. Если, допустим, mysql также выделит память, то он тоже вылетает с исключением Core Dump.
Выполните команду limits , обратите внимание на значение datasize
>Выполните команду limits , обратите внимание на значение datasize
Resource limits (current):
cputime infinity secs
filesize infinity kb
datasize 524288 kb
stacksize 65536 kb
coredumpsize infinity kb
memoryuse infinity kb
memorylocked infinity kb
maxprocesses 5547
openfiles 11095
sbsize infinity bytes
vmemoryuse infinity kbмне кажется что это не зависит от размера памяти. Программа рушится до 500 МБ. как только программе нужно больше памяти чем есть в оперативке - вылетает (например php).
может поможет показания top:last pid: 12027; load averages: 0.06, 0.02, 0.00 up 3+00:04:02 12:05:02
51 processes: 1 running, 50 sleeping
CPU states: 4.3% user, 0.0% nice, 2.3% system, 0.0% interrupt, 93.4% idle
Mem: 528M Active, 159M Inact, 155M Wired, 47M Cache, 110M Buf, 92M Free
Swap: 2048M Total, 304K Used, 2048M Free
>>Выполните команду limits , обратите внимание на значение datasize> datasize 524288 kb
>мне кажется что это не зависит от размера памяти. Программа рушится до 500 МБ.
Вот это и есть ограничение на размер памяти, отводимой под данные процесса. Побороть можно путем перекомпиляции ядры со следующими строками в конфиге:options MAXDSIZ="(2048*1024*1024)"
options MAXSSIZ="(2048*1024*1024)"
options DFLDSIZ="(2048*1024*1024)"
MAXDSIZ - как раз и есть максимальный размер сегмента данных, в данном случае - 2Гб.
Спасибо большое!
в самом деле core damp вылетает при попытке выделить больше 500 МБ. я думал, что проверяли такой вариант.
>>>Выполните команду limits , обратите внимание на значение datasize
>
>> datasize 524288 kb
>
>>мне кажется что это не зависит от размера памяти. Программа рушится до 500 МБ.
>
>
>Вот это и есть ограничение на размер памяти, отводимой под данные процесса.
>Побороть можно путем перекомпиляции ядры со следующими строками в конфиге:
>
>options
> MAXDSIZ="(2048*1024*1024)"
>options
> MAXSSIZ="(2048*1024*1024)"
>options
> DFLDSIZ="(2048*1024*1024)"
>
>
>MAXDSIZ - как раз и есть максимальный размер сегмента данных, в данном
>случае - 2Гб.это можно сделать и без перекомпиляции ядра
нужно в loader.conf
добавть, например,kern.maxdsiz="1000M"
в версиях 5.4 и новее - должно работать