Ir para conteúdo
  • Cadastre-se
KhayrusS

MMOCore (2.0) Assíncrono

Posts recomendados

 

Projeto no github

Github Wiki

Maven Central

Releases

 

Há um tempo estive me perguntando o porquê do mmocore, um dos principais componentes dos servidores L2J, não estar sendo evoluído.  O máximo de melhoria que vi, pelos diversos projetos que tive acesso ao código, foi o uso de mais de um  SelectorThread. 

Depois de um tempo de pesquisa, procurando por alguma modificação significante no mmocore, cheguei a conclusão que essa falta de melhorias só podia ter 3 explicações:

  1. A alteração no mmocore é custosa e devido ao tempo de maturidade seria um grande risco;
  2. Utilizar outra abordagem não iria apresentar um melhor desempenho, talvez até piorasse. Então quem tentou, provavelmente desistiu;
  3. Quem evoluiu o mmocore simplesmente não quis compartilhar.

Na minha percepção  era improvável que uma tecnologia com mais de 15 anos, ainda continue sendo a melhor opção para esse cenário. Visto que a biblioteca NIO, atualmente utilizada pelo mmocore, foi lançada com o Java 1.4 e uma atualização dessa mesma biblioteca chamada de NIO2 foi lançada com o Java 7, então há uma chance de melhorar o mmocore utilizando a API introduzida pelo Java 7.

Uns dias atrás, fiquei um pouco ocioso e resolvi tirar a prova eu mesmo. Resolvi desenvolver um novo mmocore, tentando manter o máximo possível de compatibilidade com o atual, utilizando sockets assíncronos que em teoria iria melhorar o tempo de resposta cliente - servidor, o que acarretaria na diminuição de lag. Mas nem tudo é perfeito, há um preço a se pagar por essa melhoria: utilização de mais recursos (Memória e CPU).  Inicialmente estimei que haveria um aumento de 25 a 40 KB no consumo de memória para cada player logado, o que daria 4 MB a cada 100 player, se você fizer a façanha de colocar 10000 players no servidor, esse número subiria para 400 MB, o que não é lá muita coisa, levando em consideração os recursos disponíveis atualmente.

Após o desenvolvimento de uma versão utilizável, fiz alguns testes de carga utilizando o jmeter, que são apresentados nas tabelas abaixo:

O teste realizado foi bem simples, projetado apenas para saber o tempo de resposta de cada solução. Para não sofrer interferência por causa da latência de rede foi realizado em uma única máquina,  o que não é recomendado por causa do compartilhamento de recursos, principalmente CPU, entre o jmeter e o servidor. Mas acredito que para uma versão inicial já é o bastante.

O teste consiste em uma variedade de players (conexões) enviarem um pacote de 8 Kb, que é maior que a maioria dos pacotes utilizados pelo cliente do Lineage 2, e esperar uma resposta de também 8 Kb. Assim foi calculado o tempo de conexão mais o Round Trip do envio de pacotes. Segue uma breve explicação sobre os dados que estão nas tabelas:

Players - Quantidade de conexões concorrentes fazendo requisições (enviado pacote) para o servidor.

Média - O tempo médio de conexão mais o tempo de envio do pacote mais o tempo de recebimento e leitura (Round Trip Time) em milissegundos.

Min -  O tempo mínimo de conexão mais o tempo de envio do pacote mais o tempo de recebimento e leitura (Round Trip Time) em milissegundos.

Max - O tempo máximo de conexão mais o tempo de envio do pacote mais o tempo de recebimento e leitura (Round Trip Time) em milissegundos.

D. Padrão - medida de dispersão em torno da média, no geral quanto menor quer dizer que os tempos estão mais próximos uns dos outros.

Throughput - Quantidade de requisições por segundo.

Erro - Porcentagem de requisições que retornaram com erro.

MMOCore utilizando Selector:
_________________________________________________________________
|Players  | Média | Min  | Max    | D. Padrão | Throughput |Erro |
|----------------------------------------------------------------|
|998	  | 60ms  | 43ms | 101ms  | 8.68      |   487.3/s  |0.0	 |  
|1999	  | 62ms  | 44ms | 115ms  | 9.01      |   769.73/s |0.0	 |  
|3993	  | 100ms | 42ms | 1261ms | 190.44    |   733.60/s |0.0	 |  
|7988	  | 411ms | 43ms | 7285ms | 889.66    |   807.27/s |0.0	 |  
|31976	  | 804ms | 6ms	 | 8792ms | 1628.33   |   769.96/s |11,3%|
 ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞
 MMOCore Assíncrono (2.0)
 _________________________________________________________________
|Players  | Média  | Min | Max    | D. Padrão | Throughput |Erro  |
|-----------------------------------------------------------------|
|1000	  |1ms	   |0ms	 |45ms	  |4.94	      |539.08      |0.0   |  
|2000	  |1ms	   |0ms	 |55ms	  |4.34	      |764.81      |0.0   |	  
|4000	  |2ms	   |0ms	 |64ms	  |4.62	      |804.50      |0.0   |	  
|8000	  |1ms	   |0ms	 |152ms	  |6.13	      |1106.19     |0.0   |	  
|32000	  |726ms   |0ms	 |45,159s |2060.37    |696.06      |11,7% |
 ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞ ͞ ͞ ͞ ͞͞ ͞ ͞

No geral, utilizando sockets assíncronos apresentou um melhor desempenho, como pode ser visto. Os arquivos com o resultado dos testes estão disponíveis no github

 

[ ]'s

Editado por KhayrusS
  • Gostei 9
  • Amei 9
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisando de Dedicado ou VPS?

Conheça a L2JCenter

Muito bom KhayrusS, você é um colírio para os olhos. 

Como contribuição vou upar um programa que gerou muita dor de cabeça um tempo atrás, para você analisar se há uma forma de fixar o problema juntamente nessa mudança, pois pelo que lembro a correção era feita no mmocore.

Gostaria de ajudar mais se possível, mas acredito que não é do meu nível de conhecimento tal façanha.

  • Amei 1
  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Como contribuição vou upar um programa que gerou muita dor de cabeça um tempo atrás, para você analisar se há uma forma de fixar o problema juntamente nessa mudança, pois pelo que lembro a correção era feita no mmocore.

Opa, com certeza analisarei. O próximo passo é utilizá-lo no Gameserver para ver como se comporta, corrigir as falhas que venham acontecer. Depois verificar questões de segurança.

 

Gostaria de ajudar mais se possível, mas acredito que não é do meu nível de conhecimento tal façanha.

Acredito que cada um pode contribuir independente de nível de conhecimento, afinal o conhecimento está por aí pra ser adquirido, quanto maior o desafio mais conhecimento é gerado. Toda ajuda é bem vinda 🙂

  • Gostei 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia campeão!

Também não tenho um conhecimento tão sólido, mas estarei acompanhando o tópico e caso aja algo em que eu possa ajudar, estou a disposição;

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jamais imaginei que alguém iria mexer nisso, e muito menos dessa forma, incrível.

Tomara que você consiga alcançar os devidos resultados, o foda e o mais triste, que jaja estará sendo implantado em futuros projetos e vai ter gente anunciando (Vendo projeto com MMOCore atualizado 10x mais desempenho) é triste.

Boa sorte com o projeto, estou acompanhando, apesar de não ter conhecimento para contribuir 

  • Gostei 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Jamais imaginei que alguém iria mexer nisso, e muito menos dessa forma, incrível.

Tomara que você consiga alcançar os devidos resultados, o foda e o mais triste, que jaja estará sendo implantado em futuros projetos e vai ter gente anunciando (Vendo projeto com MMOCore atualizado 10x mais desempenho) é triste.

Boa sorte com o projeto, estou acompanhando, apesar de não ter conhecimento para contribuir 

É realmente triste ver esse tipo de prática com open source. Eu poderia simplesmente implementar e vender, mas eu faço isso pelo prazer, pelo desafio. Então tento não pensar muito nisso.

 

 

Bom dia campeão!

Também não tenho um conhecimento tão sólido, mas estarei acompanhando o tópico e caso aja algo em que eu possa ajudar, estou a disposição;

O desenvolvimento ainda está no início, tem muitas coisas que planejo fazer, algumas a curto prazo e outras a longo prazo. Com certeza uma mãozinha a mais é sempre bem-vinda. 

O projeto está disponível no github async-mmocore. Assim como um projeto de referência para implementação. Apesar de ter realizado um teste de "sanidade" e não ter encontrado nenhum problema grave. Acredito que ainda existem bugs, mas não tenho tanto tempo para testar. Como eu sou usuário Linux, o teste foi realizado apenas em um Servidor Interlude baseado em L2jServer, pois o cliente interlude pode ser executado em Linux sem muitas dificuldades. Seria interessante utilizar em servidores mais atuais, então se alguém estiver disposto a tentar utilizá-lo,  pode contar com a minha ajuda.

Os próximos passos que pretendo fazer:

  • Escrever uma documentação, inicialmente simples, descrevendo como utilizá-lo;
  • Criar uma wiki com as principais dificuldades e suas prováveis resoluções;
  • Documentar e melhorar o código.

Quando tiver um tempo irei atualizar o post principal e o wiki do projeto no github.

 

[ ]'s

  • Gostei 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Falta só colocar online para saber as possíveis falhas? Ou existe outra maneira de se obter isso?

Editado por PeNaChO

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

 

Não pensa nisso mesmo, tem gente que faz? Tem! Mas o lineage 2 também não é tão nosso para apontarmos o dedo para isso.

Com esse pensamento de não compartilhar por que vão vender, se todos pensassem assim ninguém nunca teria feito nada. Uma coisa é você fazer para si, para utilizar, etc, entendível a questão de não compartilhar. Mas fazer pensando em não postar por que vão vender é meio sei lá, eu não pensaria assim, nem penso. Tenho algumas tralhas feitas, e provavelmente que quando não for utilizar postarei tudo.

  • Gostei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Não pensa nisso mesmo, tem gente que faz? Tem! Mas o lineage 2 também não é tão nosso para apontarmos o dedo para isso.

Com esse pensamento de não compartilhar por que vão vender, se todos pensassem assim ninguém nunca teria feito nada. Uma coisa é você fazer para si, para utilizar, etc, entendível a questão de não compartilhar. Mas fazer pensando em não postar por que vão vender é meio sei lá, eu não pensaria assim, nem penso. Tenho algumas tralhas feitas, e provavelmente que quando não for utilizar postarei tudo.

Infelizmente tu sabe que é assim que funciona, caras como @KhayrusS criam, mas quem ganha com isso não são os desenvolvedores.

Porque sempre tem uns "zé ruela" que vem aqui o fórum pegam as coisas e vão pro facebook vender, quando não mandam mp querendo vender aqui no fórum mesmo.

# FATO

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Falta só colocar online para saber as possíveis falhas? Ou existe outra maneira de se obter isso?

Eu já fiz alguns testes básicos, mas ainda é necessário ver como é comportamento com vários players logados. Ainda existe a probabilidade de haver falhas que seriam evidenciadas ao colocar online, embora eu não planeje colocar um servidor para teste por agora, nem aconselho que usem em servidores reais por enquanto. Como não tenho tanto tempo pra fazer um teste real em um servidor online nesse momento, ficarei esperando algum aventureiro tentar usá-lo e reportar os bugs que surgirem.

Alguém que tenha conhecimento sólido em Java já é capaz de utilizá-lo, em teoria em poucos passos:

  1. Compilar o mmocore disponível no repósitorio do github;
  2. Colocá-lo no classpath do projeto que pretende utilizar;
  3. Realizar as mudanças necessárias para utilizar as novas classes. 

 

Há algumas mudanças necessárias nas chamadas de método dos Packets, que provavelmente tendem a ser mais demoradas devido a quantidade de Classes existentes. Com relação a mudança do mmocore em si, basicamente o que precisa ser feito é substituir essa parte do código*:

// TODO: Unhardcode this configuration options
final SelectorConfig sc = new SelectorConfig();
sc.MAX_READ_PER_PASS = 12; // Config.MMO_MAX_READ_PER_PASS;
sc.MAX_SEND_PER_PASS = 12; // Config.MMO_MAX_SEND_PER_PASS;
sc.SLEEP_TIME = 20; // Config.MMO_SELECTOR_SLEEP_TIME;
sc.HELPER_BUFFER_COUNT = 20; // Config.MMO_HELPER_BUFFER_COUNT;
sc.TCP_NODELAY = false; // Config.MMO_TCP_NODELAY;

L2GamePacketHandler gph = new L2GamePacketHandler();
_selectorThread = new SelectorThread<>(sc, gph, gph, gph, new IPv4Filter());
InetAddress bindAddress = null;
if (!Config.GAMESERVER_HOSTNAME.equals("*")) {
    try {
        bindAddress = InetAddress.getByName(Config.GAMESERVER_HOSTNAME);
    } catch (UnknownHostException e1) {
        _log.error( getMessage("error.invalid.bind.address",  e1.getMessage()), e1); 
    }
}

try {
	_selectorThread.openServerSocket(bindAddress, Config.PORT_GAME);
} catch (IOException e) {
	_log.error( getMessage("error.open.socket", e.getMessage()), e);
    System.exit(1);
}

_selectorThread.start();

por essa:

L2GamePacketHandler gph = new L2GamePacketHandler();

InetSocketAddress bindAddress;
if (!Config.GAMESERVER_HOSTNAME.equals("*")) {
	bindAddress =  new InetSocketAddress(Config.GAMESERVER_HOSTNAME, Config.PORT_GAME);
} else {
	bindAddress = new InetSocketAddress(Config.PORT_GAME);
}

connectionHandler = ConnectionBuilder.create(bindAddress, gph,gph,gph).filter(new IPv4Filter()).build();
connectionHandler.start();

 

Contudo, há mudanças de hierarquia em L2GamePacketHandler e no Ipv4Filter. Essas alterações entre outros detalhes postarei depois quando estiver com um pouco mais de tempo.

Essas e as outras mudanças necessárias podem ser encontradas nesse repositório.

* Essa mudança está utilizando como base L2jserver.

 

 

[ ]'s

  • Gostei 4

Compartilhar este post


Link para o post
Compartilhar em outros sites

São essas coisas que fazem você um dos melhores membros do fórum. Desde 2008 até hoje!

Parabéns, brother. Que maravilha de tópico. Com toda certeza irei estudar um pouco sobre o assunto.

  • Gostei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

São essas coisas que fazem você um dos melhores membros do fórum. Desde 2008 até hoje!

Parabéns, brother. Que maravilha de tópico. Com toda certeza irei estudar um pouco sobre o assunto.

Obrigado, brother 😄

 

Adicionei uma descrição básica de como usar no githubE a primeira alpha release.

  • Gostei 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sensacional, parabéns cara! Espero que dê tudo certo...

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Sensacional, parabéns cara! Espero que dê tudo certo...

 

 

Mano parabéns, incrível como você teve uma sacada dessa, será sucesso!

Obrigado, mano!

 

Lançada a Beta Release.

  • Gostei 2
  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Lançada a Release estável.

disponível no maven:

<dependency>
  <groupId>io.github.joealisson</groupId>
  <artifactId>async-mmocore</artifactId>
  <version>2.1.0</version>
</dependency>

 

Foi testada com quantos jogadores online?

Compartilhar este post


Link para o post
Compartilhar em outros sites
 

Foi testada com quantos jogadores online?

Não foi realizado testes relacionados a quantidade de jogadores online. Esse tipo de teste sairia do escopo do projeto, além de ser um teste difícil de realizar, difícil de mensurar e altamente custoso. Os testes são realizados utilizando Jmeter. O último teste que realizei, há um tempo, foram considerados 5000 usuários concorrentes enviando 10000 pacotes,  os pacotes foram entregues em menos de 1s. Infelizmente tive um problema com a infraestrutura que utilizei pro teste, e acabei perdendo os dados. No momento, estou um pouco sem tempo pra provisionar tudo outra vez e realizar um novo teste com a última versão, mas assim que der realizarei.

  • Gostei 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Mudanças no Login

    Preste atenção às mudanças no método de login.

    Com a migração para nomes de usuário IPB4 não existe mais.

    Você deve usar seu nome de exibição ou email em vez de nome de usuário.




     



×