Империя - Право на жизнь

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Империя - Право на жизнь » Об игре "Империя - право на жизнь" » Пример решения проблемы с перфомансом сервера


Пример решения проблемы с перфомансом сервера

Сообщений 1 страница 7 из 7

1

1. Нужно, как минимум, уменьшить трафик между сервером и клиентом. в текущей версии для чата, событий и т.д., каждый раз передается весь список последних сообщений. подозреваю, что на стороне сервера оформлено в виде:

Код:
mysql_query("SELECT * FROM `chat` ORDER BY `date` DESC LIMIT 15");

для всех этих мест, нужно запоминать id последнего посланного пользователю сообщения (в сессии этого пользователя), ну и запрос будет соответственно:

Код:
mysql_query("SELECT * FROM `chat` WHERE `message_id`>".$_SESSION['last_message_id']." ORDER BY `message_id` ASC LIMIT 5");
...
$_SESSION['last_message_id']=$new_messages[count($new_nessages)-1]['message_id'];

в клиенте же, обновление чата делать не как сейчас - перезаписью содержимого всего окна чата, а добавлением новых пришедших сообщений. кстати. тут можно было бы и без LIMIT 5, но, на всякий случай лучше добавить, может в будущем потребуется вывод старых сообщений - чтобы портянка пересылаемых за один раз сообщений не вышла большой, берем только а за несколько запросов эти сообщения по порциям получить.

но это само по себе не поможет снизить нагрузку на проц (не намного уменьшит), но зато уменьшит трафик сервера в несколько раз.
прой же сервера, в основном, загружен непомерно высоким количеством sql запросов, поэтому, избавимся от большинства насовсем!

2. Избавляемся от ненужных sql запросов.
есть такая штука. memcache называется. хранит значения по ключу в оперативной памяти. используя его можно не делать лишних запросов в базу. например, для пример с чатом из п.1. у нас есть запрос, который выбирает сообщения с ID больше такого то. на нужно во время добавления сообщения в чат:
1) записать его в mysql базу
2) это же сообщение записать в мемкеш, например по ключу "chat_message_$ID"
3) записать его ID по ключу LAST_MESSAGE_ID=$ID.

тогда при обращении к chat.php из сессии пользователя берется последний посланный ему ID сообщения. сравнивается с LAST_MESSAGE_ID и если этот LAST_MESSAGE_ID не равен тому, что записан у пользователя в сессии. взять (из мемкеша) сообщения, по ключам от "chat_message_".($_SESSION['last_message_id']+1) ... до LAST_MESSAGE_ID, их послать пользователю как массив новых (возможно выкинув из них сообщения, которые пользователь не имеет права видеть), и записать в сессию пользователя значение из LAST_MESSAGE_ID.

в общем такой механизм. В результате на чат вообще не будет почти никакой нагрузки и обновление его можно сделать несколько раз в секунду.

может немного непонятно, но стоит почитать про memcache в php. ну и, если интересно, то могу от своего проекта чат откострировать и тебе выслать готовый рабочий код, как демку. на основе его напишешь для своего проекта. причем для начала переделать чат, после подобовлять данный механизм и во все остальные скрипты: sobitiya.php, mir.php, personalMir.php и newRound.php

0

2

=O Cильно

0

3

А как предложишь массив мемкеша чистить? по ключу он быстро наполнится ненужным мусором.
Покажи свой проект ;)
Научи меня! Как ты узнал про sobitiya.php, mir.php, personalMir.php и newRound.php =)))

0

4

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

один из моих опенсорс проектов (но это не совсем игровой проект, частный случай CMS для Ragnarok Online или The Mana World игровых серверов): исходники http://git.bam-m.com/  ROse - называется. старая версия на sourceforge.

чат в нем с использованием мекенша: http://git.bam-m.com/?p=rose.git;a=blob … a3;hb=HEAD там после описания класса - пример как работает. т.е. ничего там сложного. но я могу именно сделать рабочую демку только с чатом.
добавлено: там на самом деле используется memcached а не memcache - но суть от этого не меняется. почти одно и тоже.

про то как я узнал про имена скриптов - посмотрел трафик - который мой браузер генерирует. потому сразу и бросилось вглаза, что передается на каждом запросе все что в чате! что ну никак не стоит делать, зы. и, лучше, я бы не в XML виде все это слал а JSON-ом. опять же для урезания трафика.

Отредактировано Kenshin (2013-03-06 11:50:46)

0

5

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

Отредактировано Kenshin (2013-03-06 12:00:34)

0

6

Спасибо! Буду постепенно разбираться =) А ты есть в контакте?

0

7

http://vk.com/uvadzucumi - но я не регулярно там бываю. переодически захожу.

0


Вы здесь » Империя - Право на жизнь » Об игре "Империя - право на жизнь" » Пример решения проблемы с перфомансом сервера