Размеры heap и стека по умолчанию

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Размеры heap и стека по умолчанию

Сообщение Ichthyander » 29.01.2018 20:09:49

Есть ли тут кто пробовал работать с настройками FPC размер кучи и стека при компиляции (ключи -Ch -Cs).
Где можно об этом подробнее прочитать?
2018-01-29_20-08-24.png

В свое время я преодолел проблему того, что программа не могла запустить потоки более определенного значения, прописав размер стека (-Cs).
Теперь возникает такая проблема: при загрузке очень большого количества данных в программе некоторые клиенты жалуются на ошибку (риск повреждения данных) или программа вылетает. Я предполагаю, что мне нужно увеличить размер кучи.
Да, и если что, я понимаю, что в моем случае правильнее перевести все на движок базы данных, но я начинал делать эту программу очень давно и сейчас довольно запутанная архитектура взаимодействия потоков и классов и т. д., что не позволит легко и быстро интегрировать, к примеру, SQLite... Собственно, речь не о том, что это все неправильно: большое количество потоков и данные, которые загружаются в память.
В будущем я переделаю, а сейчас хотелось бы временного решения за счет ключей компиляции
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Размеры heap и стека по умолчанию

Сообщение olegy123 » 29.01.2018 22:56:38

посмотрите https://www.freepascal.org/docs-html/rt ... fails.html

В линуксе работает программа? Сам столкнулся с такой ошибкой под си. Когда после определенном времени программа сообщает об нехватки памяти. Смотрел на увеличении кучи и стека. Но реально помогло переназначение размера использовании памяти https://www.freepascal.org/docs-html/rt ... ocmem.html
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Размеры heap и стека по умолчанию

Сообщение Ichthyander » 30.01.2018 10:25:42

olegy123 спасибо за ссылки! Действительно полезные, не знал об этом. А по поводу ключей видимо действительно в интернете нет информации об этом, потому как никто не может сказать. Странно, что об этом нигде нет инфы.
Программа работает в Windows. Но в Linux пробовал компилировать - работает. Правда среди клиентов программы нет линкусоидов и тему с линуксом не стал продвигать. Есть те, кто хотел под макос, я даже скомпилировал, но нет времени проверить как она работает на рабочей машине (можно конечно наверное виртуальную ОС поставить, но не стал замарачиваться)
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Размеры heap и стека по умолчанию

Сообщение Cheb » 30.01.2018 11:31:44

Опыт полученный на собственной шкуре:
- размер кучи не имеет значения. Всегда ставлю десять килобайт, оно растёт само пока есть куда
- размер стека игнорируется под виндовс (она ставит дефолтные 16 мегабайт) но имеет значение под линуксом. Ставлю вручную 16 мегабайт - столько же, сколько дефолтно выделяется под виндовс.
- каждый thread отъедает кусок адресного пространства, резервируя линейный, непрерывный диапазон адресов под стек. 64-битным программам пофиг, а у 32-битных абсолютный лимит где-то в районе одного-двух гигабайт (в теории - 4, но столько почти никогда не бывает). Создаёшь полсотни потоков - и уже 800 Мб нету, они сидят на этих адресах как собака на сене, и уже можешь словить крах из-за исчерпания адресного пространства. Это при том, что реально памяти используется с гулькин нос.
- у TThread.Create вторым параметром идёт таки предельный размер стека. Передаёшь 160 Мб каждому - и уже после четвёртого потока твою 32-битную программу начинает колбасить и сосисить (был у меня такой момент, конский стек надобился из-за неоптимальной работы системы сериализации). Но можно же и меньше! Один мегабайт, например. Только рекурсию не используй.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Размеры heap и стека по умолчанию

Сообщение Ichthyander » 30.01.2018 11:43:37

ChebСпасибо за рекомендации! Большей частью приходится это проверять методом тыка, разве что в свое время прочесть подобные советы. Единственно, что по поводу потоков под Windows...
Cheb писал(а):- каждый thread отъедает кусок адресного пространства, резервируя линейный, непрерывный диапазон адресов под стек. 64-битным программам пофиг, а у 32-битных абсолютный лимит где-то в районе одного-двух гигабайт (в теории - 4, но столько почти никогда не бывает). Создаёшь полсотни потоков - и уже 800 Мб нету, они сидят на этих адресах как собака на сене, и уже можешь словить крах из-за исчерпания адресного пространства. Это при том, что реально памяти используется с гулькин нос.

Скажу от себя. В свое время, чтобы побороть проблему того, что каждый создаваемый поток отъедал значительную часть памяти, которая ему потребовалась бы (из-за этого система и не запускала дальше потоки, когда их количество примерно достигала от 60 до 120 на разных компьютерах), причем такое происходило и на 64 битных (может тут и ошибаюсь).
Я делал так
Код: Выделить всё
constructor TMyThread.Create;
begin
  ...
  FFailedToCreate := False;
  try
    inherited Create(True, 128*1024);
  except
    FFailedToCreate := True;
  end;
...
end;
, где 128*1024 и есть вроде бы размер стека, но... Это типа не срабатывало, был или и есть глюк в лазаре, что все равно бралось значение по умолчанию. И мне удалось чтобы это заработало методом тыка, только когда проставил значение стека в настройках компиляции проекта, как я показал на картинке сверху...
P.S. Сейчас может все работает как надо и размер стека в Windows можно прописывать при создании и без этих манипуляций... Может я что-то и перепутал тут. Давно делал и не помню точно, что и зачем я это делал досконально )

Добавлено спустя 4 минуты 35 секунд:
Да, вот нашел. был баг (может и есть еще) https://bugs.freepascal.org/view.php?id=17755
Получается какой бы маленький стек не задаешь для потоков, все равно не создается больше определенного количества в Windows. Помогает как раз этот ключ -Cs. Ньюансов проблемы не помню, но после этих манипуляций программа смогла создавать и 100 и 300 и 500 потоков :)
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Размеры heap и стека по умолчанию

Сообщение Cheb » 30.01.2018 13:48:03

100 и 300 и 500 потоков

Строго говоря, это уже извращение и повод задаться вопросом "ЧЯДНТ" :D
С другой стороны - живи-живи и ня топни? :D

Сейчас может все работает как надо

В былые годы и не такое случалось. Вот, например, определённые версии Windows 98 крашились (вся система целиком) если в TStream.Create указать нулевой размер стека.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Размеры heap и стека по умолчанию

Сообщение Ichthyander » 30.01.2018 15:00:26

Cheb писал(а): 100 и 300 и 500 потоков
Строго говоря, это уже извращение и повод задаться вопросом "ЧЯДНТ" :D

Я в курсе, о чем в принципе сам и оговорился в самом посте. В любом случае, для меня это не является проблемой сейчас.
Cheb писал(а):В былые годы и не такое случалось. Вот, например, определённые версии Windows 98 крашились (вся система целиком) если в TStream.Create указать нулевой размер стека.

Ну, не настолько былые годы. Тот, кто багрепорт этот запостил говорит о Windows 7...
Но вот я на некоторых конфигурациях, как оказалось уже не прописывал размер стека и вроде с естественными ограничениями в количестве потоков никто не сталкивался[, только с искусственными )) ]

Добавлено спустя 1 час 10 минут 51 секунду:
По существу топика, если кому-то будет интересно:
By default Free Pascal allocates a small part of RAM for your application as heap memory. If it just allocated all it could get, people running Windows would have problems as Windows would increase the swap file size to give the program more memory on and on, until the swap file drive would be full.

You can specify the size of the heap with -Chxxxx.

However, the heap size doesn't really matter, since the Heap is able to grow: if you've used all the available heap space, the program will try to get more memory from the Operating system (OS), so the heap is limited to the maximum amount of free memory provided by the OS.

It is only handy if you know you will need at least a certain amount of memory. You can then specify this value using the -Ch parameter, so your program will allocate it at once on startup. This is slightly faster than growing the heap a number of times.

https://www.freepascal.org/~micha/fpc/f ... neral-heap
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 668
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Размеры heap и стека по умолчанию

Сообщение olegy123 » 30.01.2018 16:22:42

У меня была такая история: под raspberry pi постоянно нужно было выделять и удалять разные объемы данных от 100кб до 20мб.. все в один pointer, но это было в thread-е.
Вот через несколько минут программа выдала ошибку памяти нет.

Тоже думал отчего так, так как thread то скорее стека не хватает, при запуске можно указывать его размер. Решил попробовать до всех экспериментов и фокусов reallocate, глобализировал phointer переписал код..
Все чисто пошло..

Тут скорее есть особенность в линухе, а точнее линуховый thread и виндовый поток(нить) формируются по разному, по разному распределяются ресурсы. в Линухе thread - это полноценная программа.
Возможно нужно тюнинговать само ядро, есть волшебные параметры. Точно знаю, что ядро настроено на сеть в 100мбитку, с гигабиткой ведет себя как с соткой. нужно ядру точно показать что параметры иные.

Добавлено спустя 6 минут 3 секунды:
нужно было поднять самодельный iSCSI - там тюнингуется все, и сетка, транки и проге указывать надо.. Даже само железо нужно было перевести на Jumbo фреймы.. указать точно размер буфера в железке.. и все это ручками.

Добавлено спустя 7 минут 32 секунды:
Пропатчил ядро - сеть пропала.. Лезишь в ящик, подключаешь монитор, выясняешь чё.. Оказывается дрова производитель еще не обновил. Откатываешься назад.

"Страх и ненависть в корпоративном сегменте с Opensource"

Добавлено спустя 3 минуты 46 секунд:
Кстати, надо залезть и почитать что там с менеджерами памяти, вроде хотели сменить.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22

Рейтинг@Mail.ru