Управление Mono GC - PullRequest
       46

Управление Mono GC

1 голос
/ 30 августа 2009

Прямо сейчас я испытываю всплески задержки каждые 3-4 секунды, когда на GCing тратится 500 мс +.

У кого-нибудь есть указания по управлению моно GC? То есть заставить его собирать n% памяти вместо 100% при увеличении интервала сбора.

Спасибо

Ответы [ 4 ]

2 голосов
/ 30 августа 2009

Боюсь, что в отсутствие контроля над вашей реализацией GC единственный ответ на такие вопросы, который даст вам полезные результаты, - «Прекратите создавать так много объектов».

Конкретным ответом на ваши конкретные потребности является использование продолжений.

Продолжения в моно имеют разновидность стека для копирования . (при условии, что вы используете встроенную реализацию Tasklets).

Похоже, что монокомпилятор / JIT хранит эти копии в управляемом коде, поэтому использование продолжений с низким отношением работы к выходу может привести к значительным издержкам GC. Таким образом, ваши проблемы с количеством времени GC настоятельно предполагают, что вы используете сопрограммы таким образом, что аспекты реализации перевешивают количество времени, которое вы тратите на фактической сопрограммы с некоторым запасом.

Если вы зависите от продолжений производительности, вы можете рассмотреть возможность перехода на непереносимую альтернативу (поскольку они не поддерживаются в Windows CLR, это не теряет много переносимости) в неуправляемом коде для этого аспекта ваша система.

Вы также можете перейти к основанной на перечислении модели, используя (полностью переносимые) конструкции yield return, которые будут вызывать создание объекта только при первом вызове, а не на всех выходах, которые могут быть чистым выигрышем. Очевидно, что код потребует переписывания, и это не будет работать так же хорошо, если вы используете вложенные конструкции. Для ознакомления с этим обратитесь к разделу , озаглавленному «C # Yield Statement in Mono» , который используется в Unity.

1 голос
/ 30 августа 2009

GC Mono является консервативным генератором поколения Boehm, который, как мне кажется, не имеет ни одного из этих элементов управления.

1 голос
/ 30 августа 2009

Если его дизайн похож на .NET GC (что, я бы сказал, так), вы, вероятно, не можете. Но тогда тебе не нужно этого делать. Сборщик мусора лучше вас знает, что происходит в памяти компьютера.

Я думаю, что лучший способ справиться с этим - изучить собственный код. ПОЧЕМУ вы выделяете столько памяти, что происходит столько сборов? Является ли оборудование, на котором вы работаете, адекватным для выполнения цели кода? Вы могли бы извлечь выгоду из какой-нибудь схемы кэширования диска (так как большая часть этой памяти, которая выделяется, кажется, уходит в короткие сроки)?

0 голосов
/ 16 марта 2011

Если вы используете mono через mod_mono, взгляните на параметры конфигурации mod_mon, которые позволяют перезапустить сервер после нескольких запросов. Конечно, это грубое решение, но оно помогает избежать постоянного увеличения размера процесса.
http://linux.die.net/man/8/mod_mono
См. MonoAutoRestartMode, MonoAutoRestartRequests, MonoAutoRestartTime

...