Balancer: Все сообщения за 3 Июля 2007 года

 
ПнВтСрЧтПтСбВс
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

Balancer

администратор
★★★★★
Ошибка не из тех, что может уронить сервер. Хотя - чем чёрт не шутит...

Какая сборка?

Всегда ли перед падением есть эта ошибка?

Какая ОС? Что у неё в системных логах?
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
В принципе - да, статику таким образом раздавать можно.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Ох, аж 13 журналистов убили! За семь лет!

Никто не считал, сколько за это же время убили дворников, школьников, профессоров, врачей, колхозников?

И не только в России.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Или клиент криво обновился, или сервер, или БД некорректно обновлял (хотя, вроде, структуру давно не меняли)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
А вот я сейчас точу зубы на нечто с матрицей не меньше 1/1.8, батарейками AA/AAA и поворотным экраном. Ввиду того, что мыльница есть, можно подумать и о покупке чего-нить покрупнее.

Выбор оказывается крайне невелик: Сравнение моделей.

И, как назло, среди них нет ни одной с оптическим стабилизатором.

...

Изменить, что ли, Кэнону и взять Фуджик? :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Из ЛОРовского топика, чтобы потом не искать:

http://www.openscenegraph.com/ - тулкит для разработки 3D-графики.

osgCal2 - Adapting cal3d to OpenSceneGraph - скелетная анимация для него

OpenSceneGraph Audio Library | Free Audio & Video software downloads at SourceForge.net - Audio Lib

The C10K problem - не вник сходу.

at Ireon.org - интересный, судя по всему, задумывался проект. Но, похоже, его погубило то, что народ два года писал документацию ;)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Навеяно дискуссией на ЛОРе.

Насколько, всё же, реально оправдан UDP?

Ибо усложнение будет заметное (нужно помнить отосланные пакеты и ждать их подтверждения) + прирост трафика (пакеты подверждения).
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
masterXL> каков механизм запроса на обновление?

Как вариант - в имени каждого ресурса хранить его хеш. Тогда при изменении оного, у него станет просто новое имя.

masterXL> опрашивать чексумм директории клиента со статическими объектами и при несовпадении синхронизировать? при таком варианте логичнее было бы использовать сам сервер для раздачи обновлений.

Первичная раздача, естественно, пойдёт с сервера. А уже после того, как файл окажется и у клиентов - тянуть можно оттуда.

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

Только следует тщательно анализировать состояние сети. Раздача не должна забивать основные соединения. Командный поток должен идти с наивысшим приоритетом.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Вот потому и спор :)

geek в ЛОРовском топике (можешь почитать) утверждает, что FPS-отзывчивость может быть только на UDP. И, в общем, он прав (порядок пакетов тут не столь важен, если к вопросу подходить вдумчиво, скажем, при беге, если придёт "старый" moveto при наличии более нового, то он просто проигнорирыется. Не дохождение пакетов решается подтверждением о получении пакета) - но для FPS :) Сразу возникает вопрос, возможна ли MMOFPS, но и тут был откопан ответ - World War II Online - Wikipedia, the free encyclopedia

У них именно MMOFPS и именно на UDP. При чём разработчики как раз плакались, что на UDP надо было делать с самого начала - 404 Not Found

Но UDP - это, как я уже говорил, существенное усложнение системы и затраты ресурсов.

И, как назло, это вопрос, который лучше всего решать изначально. Ибо это скелет всей системы :D

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

Balancer

администратор
★★★★★
Дык, естественно, что так и планируется. Идёт загрузка только объектов в зоне видимости. При чём, начиная с самых близких. Входить же можно сразу, не дожидаясь загрузки. Так и было в ActiveWorlds (как сейчас - не знаю. В SecondLife же начальная локация небольшая сразу включена в скачиваемый клиент). Заходишь (первоначально) в совершенно пустой мир, даже, ЕМНИП, без поверхности, в воздухе висишь. Потом появляется земля и отметки объектов в виде маленьких чёрных пирамидок (то, что в браузере место под картинку, пока она ещё не загружена :) ) потом начинают появляться игроки, стены, деревья, горы... Всё дальше и дальше :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Да, самое главное. Все p2p, в т.ч. торрент, эффективны только на больших объёмах данных. Хотя бы от десятков мегабайт.

Все наши объекты будут явно меньшего размера.

Так что прямая передача объектов по классическим технологиям нам не выгодна.

Возможные решения:

- Делать "пакеты локаций" - архивы с набором объектов определённой области и качать сразу весь архив (фишка должна быть настраиваемой).

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

Balancer

администратор
★★★★★
Чтобы не было недопониманий и многократных объяснений, опишу на словах, как должен выглядеть сетевой протокол.

Сетевой обмен подразумевается на двух (а, возможно, и больше, если будет ещё UDP) уровнях.

- Одноразовые соединения для закачки данных и объектов, в духе современного HTTP. Более того, это может быть именно HTTP. Опционально - torrent (peer-to-peer)

- Постоянное соединение ("командный поток") на манер нынешнего у L2, по которому сервер будет управлять клиентом, а клиент - отчитываться серверу.

Т.е. на однонодовом уровне работа будет выглядеть как типичная работа L2-сервера с клиентом, с поправкой на то, что в командах сервера вместо ObjectID будут передаваться универсальные сетевые идентификаторы объектов, которые потом клиент, при необходимости, будет доставать из сети.

Межсерверная же работа будет выглядеть, безусловно, намного сложнее и потребует тщательной проработки.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Похоже, идея настолько витает в воздухе, что уже начинает кристаллизовываться: DTF.RU - Новости - Тендер на MMORPG

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

Balancer

администратор
★★★★★
KILLO> или его жены(в количестве).

Конспирологи, "забаненные на Гугле" :D

… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
KILLO> или его жены(в количестве).

Конспирологи, "забаненные на Гугле" :D

1|1|1|1|1|1|1&ses_id=cccca18c0c35fa9b539fdacab6d9dd20&update_cluster=1&p_id=&cur_clust_id=1Результат поиска[/url]
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Упрощённо задача стоит такая. Есть тысяча соединений, взаимодействующих с большим игровым миром.

Нужно минимизировать время отклика, не повышая загрузку сервера.

Классическое решение, применяемое всюду - это TCP.

Народ говорит о более эффективной реализации задачи через UDP.

Проблема в том, что в моём представлении основная часть игровых команд требует подтверждения о передаче. С TCP это гарантируется. С UDP придётся отсылать подтверждение о получении. Т.е. с одной стороны клиент (при отсутствии ошибок) быстрее получит пакет и начнёт действовать, с другой - серверу придётся помнить об этом пакете (в то время, как TCP-пакет просто тупо будет отправлен и забыт), при отсутствии подтверждения через заданное время перепосылать его или предпринимать какие-то действия и т.п.

Плюс к этому за счёт пакетов подтверждения возрастает трафик.

Ваши соображения? Кто-то на практике с этим вопросом сталкивался?
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
BrAB> интересно другое - кому и зачем может понадобится ГЛОНАСС на гражданке? какой смысл есть есть GPS не уступающий ГЛОНАССу ни по одному из параметров?

Зачем MacOS, когда есть ни в чём не уступающий ему Windows?

Зачем Пепси, когда есть ни в чём не уступающая Кока?

Зачем Opera, когда есть ни в чём не уступающий Firefox?

Зачем ты, когда есть масса ни в чём не уступающих тебе людей? :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Дык, а что там кроме ssh ещё нужно-то? :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Ну так берёшь в SSH и делаешь tail на логфайл. Или сервер запускаешь в screen'е.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Очень дельная мысль в пользу UDP (с ЛОРа):

>Подтверждение не обязательно, достаточно ввести в пакет понятие sequence и внутреннюю команду на replay_sequence

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

Получается легко и быстро.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Vale> Есть еще фича. Если трафик шифровать (защита от взлома)

Фигня это, а не защита. Т.е. ненужная проблема. И клиент и сервер будут открытыми (да и были б закрытыми - реверс-инжиниринг никто не отменял), так что клиент в любом случае может послать что угодно.

Так что нам это не актуально :)

Хотя шифрация у нас тоже есть. Но простым хешированием случайного числа. Клиент получает на выбор несколько команд, которые может послать серверу, но подделать их не может, так как они одноразовые :)

А так - очень дельная мысль в пользу UDP (с ЛОРа):

>Подтверждение не обязательно, достаточно ввести в пакет понятие sequence и внутреннюю команду на replay_sequence

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

Получается легко и быстро.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
BrAB> Конни Полгрейв — Википедия

Ага, а теперь сравним с той же популярностью Собчак, Ксения Анатольевна — Википедия и дружно убъёмся апстену? :D

:apstenu: :apstenu: :apstenu: :apstenu: :apstenu: :apstenu: :apstenu:
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
В общем, я сейчас полез возиться с тестами (захотел посмотреть время отклика) и...

В общем, делаю такой эхо-сервер:
code python
  1. #!/usr/bin/env python
  2.  
  3. import socket
  4. sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  5. sock.bind(('',7779))
  6. # loop waiting for datagrams
  7. try:
  8.   while True:
  9.     data, address = sock.recvfrom(8192)
  10.     print "Datagram '"+data+"' from", address
  11.     sock.sendto(data,address)
  12.     print "Echo"
  13.  
  14. finally:
  15.   sock.close()


и такой клиент:

code python
  1. #!/usr/bin/env python
  2.  
  3. import socket
  4. sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
  5. data = """A few lines of data
  6. to test the operation
  7. of both client and server."""
  8. for line in data.splitlines():
  9.   sock.sendto(line,('airbase.ru',7779))
  10.   print "Sent:", line
  11.   response = sock.recv(8192)
  12.   print "Received:", response
  13. sock.close()


К сожалению, единственная машина, кроме тестовой с прямым IP без
Питона стоит. При работе с локалхоста - всё ок.

При подсоединении из-за NAT'а до сервера пакет доходит, ответ он
отсылает ('Echo' в выводе), но клиент ответа так и не получает.

Это из-за firewall'а? Если да - то полный облом для UDP.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
А Linux машины между собой соединяйте по NFS. Это будет в 2..5 раз быстрее и "нативно". В т.ч. с передачей любых символов в именах файлов :)

А так - да, для Win-машин в качестве доменного сервера используют Samba. У меня оно года три назад вполне в качестве AD-сервера работало, юзеровские, там, данные автоматом на сервере хранило и т.п.

Ну и сейчас дома как простая windows-шара стоит, у машины жены документы на домашнем серверочке лежат.

Хотя две моих машины "переплетены" по NFS :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Ещё там полезный параметр (для подключения на ходу) -n число_строк[/trem] - это сколько доставать строк при первом показе.

Да и "f1" - это что? Обычно юзается просто [term]tail -f файл1 файл2 файл3 ...
" (полезно часто несколько файлов показывать вместе, например, логфайл и игровой чат)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
BrAB> Рома, тебе пора завязывать с отдельной реальностью. мы тут обсуждаем откуда в инете фотки лабрадора - Собчак то тут при чем? тема лошадей вроде не поднималась...

Естественно, я уже достаточно хорошо тебя знаю. Так что заранее знал, что смысла сказанного ты не поймёшь. Для этого нужно просто чуть шире на вопрос посмотреть, а это - не для тебя.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Всё, UDP отменяется.

"Серые" клиенты не смогут получать по нему данные с сервера.

...

Хотя ещё возможен вариант, когда клиент соединён с сервером в два потока и отсылает ему данные по UDP, а получает - по TCP.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Мне тут товарищ, плотно занимающийся GPS-картографией, сказал что на днях выходит модель (забыл, как зовётся) GPS-трекера, какую я давно ждал. Он может работать и как обычный Bluetooth-GPS модуль дла КПК, и, главное - больше суток (имеется в виду одна зарядка аккумулятора) автономно писать трек.

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

Ценой ожидается, вроде, до 4000р.

Так что с C550 в этом смысле правильно поступил, не переплачивая за встроенный GPS N560 :)

Разве что, взяв N560 мог бы юзать GPS уже несколько месяцев.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
viatcheslav_> кстати, как Путин умудряется цензурировать западные СМИ на предмет фоток дочерей?

У КГБ руки длиинные :D
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Решил тут сравнить производительность Java и Python в "большой" мультитредовости.

Задача: запустить 10000 тредов, каждый из которых тупо подождёт секунду и закроется. Выйти из системы.

Исходный уровень: совершенно не знаю, как это делается в Питоне и ничего сложнее мелких системных скриптов на нём не писал. На Java довольно плотное программирование около 2.5 лет в весьма крупном проекта, но с тредами сам на низком уровне не работал, только обработка уже запущенных процессов.

Питон: через 5 минут (буквально) копания в Гугле и тестов родил такое:
code python
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import threading
  5. import time
  6.  
  7. def proc(n):
  8.     time.sleep(1)
  9.  
  10. for i in xrange(10000):
  11.     threading.Thread(target=proc, name="t"+str(i), args=[i]).start()


Время работы скрипта - 42 секунды. Расход памяти или ресурсов процессора замечен не был.

Дальше начинается веселье. Я принялся за Java. Как сделать просто запуск тредов я так и не нашёл. Сделал запуск через шедулер. После серии экспериментов исходную задачу... так и не решил :) Треды отрабатывают успешно, но основной процесс не завершается, а так и остаётся запущенным. Если проигнорировать на завершение и закрывать потоки вручную, то выходит код примерно такой:
code java
  1. import java.io.IOException;
  2. import java.io.PrintStream;
  3. import java.util.Date;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.ScheduledExecutorService;
  6. import java.util.concurrent.ScheduledFuture;
  7.  
  8. import static java.util.concurrent.TimeUnit.*;
  9.  
  10. public class test implements Runnable
  11. {
  12.     public static void main(String[] args)
  13.     {
  14.         final int MAX=10000;
  15.  
  16.         ScheduledFuture<?>[] t = new ScheduledFuture<?>[MAX];
  17.  
  18.         System.out.println("Init");
  19.         for(int i=0; i<MAX; i++)
  20.         {
  21.             ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
  22.             t[i] = scheduler.schedule(new test(i), 0, SECONDS);
  23.         }
  24.  
  25.         System.out.println("Stop");
  26.         for(int i=0; i<MAX; i++)
  27.             t[i].cancel(true)


Дальше »»»
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

Balancer

администратор
★★★★★
Вот работающий под Java вариант (без шедулера):
code java
  1. public class TestThread implements Runnable
  2. {
  3.     int n;
  4.  
  5.     TestThread(int n)
  6.     {
  7.         this.n = n;
  8.     }
  9.  
  10.     public void run()
  11.     {
  12.         try
  13.         {
  14.             Thread.sleep(1000);
  15.         } catch (InterruptedException e)
  16.         {
  17.             e.printStackTrace();
  18.         }
  19.     }
  20. }
  21.  
  22. public class Main
  23. {
  24.     public static void main(String[] args)
  25.     {
  26.         System.out.println(System.currentTimeMillis());
  27.         for (int i = 0; i < 10000; i++)
  28.         {
  29.             (new Thread(new TestThread(i))).start();
  30.         }
  31.         System.out.println(System.currentTimeMillis());
  32.     }
  33. }


Работает 4 секунды. Т.е. в Java имеем десятикратный выигрышь :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

в начало страницы | новое
 
Поиск
Поддержка
Поддержи форум!
ЯндексЯндекс. ДеньгиХочу такую же кнопку
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru