PDA

Просмотр полной версии : [Вопрос] Оптимизация сервера (Для опытных)



Jake_Bat
10.04.2019, 21:36
Здравствуйте, господа :)
Вопрос для опытных программистов:
Расскажите все возможные, максимально полезные методы оптимизации
Приветствуются даже что-то связанное с углубленной оптимизацией, если есть возможность через ассемблерские функции и подобное.
Или например побитовый сдвиг и тому подобное.
Расскажите что максимально может губить сервер.
То, что не написано в обычных пабликовских оптимизациях.
А если и написано, дополните вашими словами.

x86
11.04.2019, 00:54
Самое губительное для сервера - Pawn, который никак не оптимизирован. Тем не менее его можно сделать быстрым без всяких инструкций и прочей фигни с помощью JIT компилятора.

DeimoS
11.04.2019, 09:13
Самое губительное для сервера - Pawn

Глупости. Для SA-MP сервера Pawn вполне достаточно и без всяких Jit-компиляторов или чего-то ещё. Люди ещё со времён 0.3а держали на хостингах сервера с десятками тысяч строк кода и не испытывали серьёзных проблем. Достаточно просто понимать что ты пишешь и не писать совсем уж кривой код.
А проблемы с оптимизацией Pawn испытывают только дрочащие на результаты профайлера и синтетических тестов. К реальности же такие тесты часто никак не относятся и чаще всего такие люди даже сервер свой не держат/не держали. Как говорится: "Плохому программисту язык программирования мешает".

В общем, на деле, как я уже сказал, достаточно не писать совсем уж кривой код и в целом понимать что/для чего ты пишешь. А каких-то методик по оптимизации не существует особо, ибо, как я уже сказал, в основном все проблемы от кривой реализации тех или иных систем, а не от проблем Pawn/SA-MP или чего-то ещё.
В любом случае, пока ты не запустишь сервер и не нагонишь туда игроков, какой-то реальной информации о слабых местах в своих скриптах ты не получишь. А до этого момента не советую тратить время на оптимизацию: стараться сразу писать нормальный код - да, нужно, но не нужно сидеть уже над написанным кодом несколько дней, с целью получения прироста в 0.1мс. Чаще всего такая преждевременная оптимизация на деле пользы не приносит. Наоборот, в определённых случаях она даже вредит. Как минимум, тем, что вместо реализации каких-то полезных систем (реализация которых может привнести гораздо более проблемный код для сервера) ты топчешься на месте и пытаешься исправить проблему, которой ещё нет.

В общем, на этапе разработки занимайся именно разработкой. А уже после, если будут заметны проблемы, подключай профайлер (https://github.com/Zeex/samp-plugin-profiler/releases), собирай статистику по работе мода и увидишь где у тебя действительно слабое место в скрипте. Таким образом ты своё время гораздо более продуктивнее потратишь, нежели если будешь изначально над каждыми 10-ю строками кода сидеть по несколько часов, думая над тем, как из них выжать дополнительную тысячную миллисекунды.

Daniel_Cortez
11.04.2019, 18:46
Самое губительное для сервера - Pawn, который никак не оптимизирован.
Pawn очень даже хорошо оптимизирован на уровне архитектуры ВМ: есть альтернативная версия ядра интерпретатора, написанная на ассемблере и даже своя реализация JIT - правда, ни одна из них не используется в сервере SA-MP (по давно известной причине).


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

public OnGameModeInit()
{
return 1 / GetPlayerVehicleID(INVALID_PLAYER_ID);
}

Стандартный интерпретатор деления на ноль не допустит, подняв состояние ошибки (а с CrashDetect ещё и выведет файл и номер строки, где ошибка произошла).
С JIT случится падение сервера. Из-за элементарного деления на ноль (а ведь есть и другие виды ошибок, вызывающие краш под JIT!) И на реальном сервере поиск таких ошибок может оказаться сущим адом, особенно если для их воспроизведения требуется участие нескольких игроков.

Jake_Bat
12.04.2019, 23:31
А что больше всего может нагружать сервер?
Как профилированием проверить stock's например?
Как правило самый ресурсоемкий паблик считается секундный таймер.
Тогда мы всегда считай будем видеть, что таймер больше всего нагружает?

DeimoS
13.04.2019, 00:07
А что больше всего может нагружать сервер?

Кривой код.


Как профилированием проверить stock's например?

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

Собственно, делать это стоит только когда есть реальные проблемы. Если и без того всё работает хорошо, то лучше пусть оно так и продолжает работать, а ты лучше займись разработкой новых систем)


Как правило самый ресурсоемкий паблик считается секундный таймер.
Тогда мы всегда считай будем видеть, что таймер больше всего нагружает?

Таймеры наоборот должны быть максимально оптимизированы. Как и любой код, который вызывается очень часто. Как правило, многие вещи, которые пихают в секундный таймер, можно реализовать более адекватными способами.
Но вообще - нет, далеко не обязательно секундный таймер будет самым ресурсоёмким.