[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Как предотвратить жёсткие зависания компьютера в ресурсоёмких играх?



В сообщении от [Вт 2017-03-21 19:53 +0300]
Max Dmitrichenko <dmitrmax@gmail.com> пишет:

> Проблема тут не в неисправном железе, не в приоритетах, не в шедулере и не в
> подобных "твиках" системы. Происходит тут следущее. Пока есть доступная память
> и swap, то ОС активно использует и то, и другое. Но в силу каких-то
> особенностей игры, со временем её потребление памяти разрастается, и она
> съедает всю доступную память+swap, и запрашивает ещё чуть памяти. Если бы игра
> попросила сразу много памяти, то ОС вызвала бы OOM-killer и убила бы игрушку.
> Но игрушка просит совсем чуть-чуть. В этот момент Linux начинает очень странную
> борьбу за память. Поскольку выгрузить данные какой-нибудь софтины в swap более
> нельзя, Linux начинает выгружать из памяти код запущенных процессов. Сделать
> это он имеет право даже при отсутствие swap'а, т.к. копия этого кода есть на
> жестком диске и он всегда сможет подгрузить этот код. Дальше начинается
> чертовщина, потому что выгруженные процессы начинают просыпаться, и линукс
> обратно начинает загружать их с ЖД в память, процесс приобретает лавинообразный
> характер, так как процессы пробуждаются быстрее, чем ОС успевает их подгружать.
> 
> Весь этот процесс напоминает сцену из фильма "Собачье сердце": когда профессор
> передвигался на двух стульях по затопленной квартире - чтобы сделать очередной
> шаг, надо освободить первый стул, и переставить его вперед.
> 
> Цейтнот и комп "виснет", так как, чтобы залогиниться и зайти с другой консоли,
> нужно выполнить как минимум несколько процессов - подгрузить getty, запустить
> процесс login, а потом shell - а все они выгружены из памяти.
> 
> Как бороться? 
> 1) Увеличить swap. 2 Гб явно маловато. Общие рекомендации для пользовательского
> компьютера состоят в том, что своп должен быть в два раза больше чем объем RAM.
> Если вас останавливает то, что нужно для это переразбивать разделы, то можете
> сделать два свопа - один в существующем разделе на 2 Гб, второй просто файлом
> на ЖД в любой существующей файловой системе. Однако, если в игрухе течет
> память, то это лишь отсрочит сценарий, описанный выше.
> 
> 2) Ограничь игруху (или пользователя брата) в использовании памяти. Как только
> она превысит лимит, то будет убита. 
> 
> 
> 20 марта 2017 г., 20:47 пользователь Зиганшин Руслан <ziganshinruslan@gmail.com
> > написал:
> 
>     Компьютеру почти 11 лет, мат. плата (socket 775, поддержка только
>     одноядерных процессоров и до 2 гб ddr2 ram) и процессор (pentium 4), как
>     самые дорогие детали, до сих пор не заменены. Может так зависнуть при игре
>     младшего брата в garrys mod, что переключение по ctrl+alt+f1 занимает
>     несколько минут, а потом из-за таймаута не удаётся войти в свою учётку
>     чтобы если не завершить зависший процесс, то хотя бы выполнить sudo reboot.
>     Под своп выделено 2 гб на hdd. На апгрейд пока нет средств. 

Не знал что линукс может выгружать код запущенных процессов без свопа,
киньте ссылку почитать про это. Однако, если такое происходит, тогда
остается единственный вариант — загружать всё в память и работать только
в ней. То есть вам нужно сделать LiveCD и загрузить его в память. 

Возьмите готовый [1] на базе например Xfce, там всё как обычно, только
рутовый раздел запакован и сжат в Squashfs. Распакуйте, сделайте chroot,
удалите офис (и всё что считаете лишним, так как у вас всего 2 ГБ),
добавьте вашу игрушку и снова запакуйте. Теперь загружайтесь с
параметром toram (загрузить в память). 

Но прежде чем заморачиваться с LiveCD, попробуйте отключить своп совсем
и посмотреть что будет. У меня был комп AMD A4 2 ядра и 2 Гб оперативки
я решил провести эксперимент с cgroups [2]. Ограничил браузер Chrome
одним ядром и одним гигабайтом оперативки, но разрешил своп и начал
открывать вкладки новостных сайтов, дабы создать нагрузку. В какой-то
момент, он начал свопить, когда своп достиг примерно 25% от оперативки,
зависло всё, так же как и у вас, зайти в консоль и вырубить его занимало
несколько минут. 

Так что увеличение свопа не вариант, можно порекомендовать zRam [3], но
у вас мало оперативки, если игрушка активно свопит, то это всё равно не
поможет.

[1]: https://www.debian.org/CD/live/index.ru.html
[2]: https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt
[3]: https://ru.wikipedia.org/wiki/ZRam

-- 
Коротаев Руслан
https://blog.kr.pp.ru

Attachment: smime.p7s
Description: S/MIME cryptographic signature


Reply to: