« April 2016 | Main | June 2016 »

May 13, 2016

��������͹��ر���

�� skynet �У���ʱ��Ϊһ������ʵ��һ��ǰ�õĴ��������Ǻ��б�Ҫ�ġ�

���磬��ϣ��������������������֧�ֳ�ʱ�ģ��Ͳ����ڹ���ʵ�ֵķ�����ʵ�֣�������������ν�ĸ����ԡ�������ڹ���ʵ�ֵķ���ǰ��һ���������񣬵���ʱ����ʱ��֪ͨ���󷽡��������ʵ�֣����� blog ������һ��ʾ����

ͬ����������Ҫ��һЩ���ؾ���Ĵ�����ʱ��Ҳ������һ�����������������̯���������������ƹ��ܵķ�����ȥ��ʵ�ֱȽϼ򵥣����ľͲ�չ���ˡ�

������̸һ����ô���ô���������õ�ΪһЩ�ȵ�����ṩ���ر�����

���ر���������ǰ�Ҿ�д�������������Ӫ��Ʒ�������������ȱ������� skynet ʹ���ߣ��������������������⡣�����Ҳ�Dz�������������Ҫ��������⡣

�������δ���İ汾�У���һЩ���ײ�ı�����ʩ������Ŀǰ�� skynet 1.0 �棬�������ɿ������ϲ���һЩ������

���������Ѿ�֪����ij���������׳�Ϊ�ȵ㣬��ôǰ��һ����������Ϳ������ܶ����顣

��ν�������񣬾����������Ĺ��ܷ���������ʱ��������Ϣ������һ�����������У��������������ת���������������Ĺ��ܷ���ͬ������Ӧ��ϢҲ�ᱻ��������ת����ȥ��

���������ڹ�����Щ��Ϣʱ��������һЩ���������磺

���ij��������������Ƶ�����������ʱ������Щ���󣬶�����ת��������������������������˹�ƽ�ԡ������������Դ�ķ����Ѿ��˳����ڴ���������������������δ���������������ֱ�ӽ���Щ��Ϣ���������Ṧ�ܷ���ĸ�����

���ǻ����ԴӴ������񿱲��Ӧ�Ĺ��ܷ���ĸ��������������ܷ����æ��Ҳ������ʱ�����µ������������������Ǵӵ��Կ���̨�Թ��ܷ�������Կ���ָ��ʱ�����Ը���Ļ�Ӧ�����ӵ��Կ���ֱ̨�ӶԹ��ܷ�������������������������Ͻ������ʱ������������غ󣬵���ָ����Ӧ�ٻ��Ἣ�󽵵����ϴ������ϵ�Ч�ʡ�


skynet �Ա�д���������Ѿ��ṩ�˲�����֧�֣�����Բο� clusterproxy ���� ����д�Լ��ķ��������

ͨ��һ�����������������ģ�

local skynet = require "skynet"
require "skynet.manager"    -- inject skynet.forward_type

skynet.register_protocol {
    name = "system",
    id = skynet.PTYPE_SYSTEM,
    unpack = function (...) return ... end,
}

local forward_map = {
    [skynet.PTYPE_LUA] = skynet.PTYPE_SYSTEM,
    [skynet.PTYPE_RESPONSE] = skynet.PTYPE_RESPONSE,    -- don't free response message
}

local realsvr = tonumber((...))

skynet.forward_type( forward_map ,function()
    skynet.dispatch("system", function (session, source, msg, sz)
        skynet.ret(skynet.rawcall(realsvr, "lua", msg, sz))
    end)
end)

����Ĵ��벢������������Ҫ�����������ҵ���߼���ȫ����

ʹ�� skynet.forward_type ��Ҫ�ṩһ��ӳ�������ʾ����Ҫ������Щ���͵�Э�顣����֮�⣬�� skynet.start ���÷�һ�¡�

��ӳ����е�Э����Ϣ����ܲ����ͷ���Ϣ��ռ���ڴ棬����Ϊ�˱���������Ҫ����Ϣ������ͬʱ����Ҳ����С�ĵĴ������ǣ������ڴ�й©��

������������У����е� lua Э��������Ϣ���ض���Ϊ system ���������������¶��� unpack �����������κν����������Ȼ�������� dispatch �����У�ʹ�� skynet.rawcall ֱ�ӷ�����Ϣָ�룬�Ӷ��ƹ�������̺ͶԻ�Ӧ���Ľ�����̡�

���ﻹӳ���� response ����Ϣ��������Ϊ���ÿ�ܲ�Ҫ�ͷ������ں��� dispatch �ڣ�skynet.rawcall ���صĻ�Ӧ���� C ָ��ͳ��ȣ�ֱ�ӽ��� skynet.ret �Ϳ��Ի�Ӧ��ԭʼ�����ˡ�

�����ʾ��ֻ�����������Ӧģʽ����Ϣ������㻹����ȷת������� skynet.send ��Ϊ��������������ж�һ�� session �Ƿ�Ϊ 0 ����������Ϣ�� session Լ��Ϊ������ 0 ��������


����жϹ��ܷ����Ƿ���أ�

��������ϼ�أ�����Բ鿴 log ��Ŀǰ����Ϣ���й�������������ʱ������� "May overload, message queue length = xxx" ��

�����Լ�Ҳ����ͨ�� skynet.mqlen ��һ�µ�ǰ����������Ϣ���г��ȡ�

�������ȡ��ѯ�Է��Ƿ���ܼ�ʱ������Ϣ���Ƚϼ򵥵ķ�����ʵ��һ��Э�飬���̷��ء�����Ϊ���󷽣�ʹ�� skynet.now ����һ���������Ļ�Ӧ�ٶȡ������µ� skynet �汾�У���������Ĭ�ϵ� debug Э�� ping ����������顣

local ti = skynet.now()
skynet.call(address, "debug", "PING")
ti = skynet.now() - ti

ʹ�� debug console �Ļ�������ʹ�� ping address ���

btw. ������Ĵ���������ʹ�� debug ping �ǰ�ȫ�ġ���Ȼ response ����Ϣ����Ϊ�� skynet.forward_type �޸�Ϊ�����ͷţ��� debug ping Э��Ƚ����⣬���Ļ�Ӧ��Ϣ������Ϊ�ա�

�������Ҫ�ڴ��������з����������󣬼ǵ�ʹ�� rawcall �����ٵ���Ӧ��ָ�롣

skynet.trash(skynet.rawcall(address, "lua", skynet.pack(...)))

��Ҫ�ֹ����� ping �� response ��Ϣ��


��μ�ʱ��֪һ�������Ѿ��˳���

skynet �����Ƽ���������ʹ�� skynet.monitor ����һ���Լ��ļ�ط������з�����˳�����֪ͨ�����������÷������Ѿ����Ƽ��ˡ�

�������صķ�����һ�� lua ����Ļ���Ŀǰ��򵥵ķ����������������һ���������ص����󡣶����÷��������˳��Ļ������û�з��ص����󽫻��ɿ���������׳�һ�� error �����ԣ�ֻҪ��ʹ�� pcall ����Ҫ��صķ�����һ�� skynet.call �����ܸ�֪�������˳��ˡ�

skynet ���°汾������һ�� debug ָ�� link ���԰�����������£�

pcall(skynet.call, address, "debug", "LINK")

May 07, 2016

skynet �����ɳ�б���

���������µ� MMO ��Ϸ��һ������С��ģ���ԣ���¶��һЩ���⡣

�������ڿ��� 3 Сʱ��ͻȻ�ڴ汩�ǣ�CPU ռ�����������ࡣ��ʱ SA �Ѿ��յ������ʼ��������������ʱ�䣬����Ϸ���ܻ������������˰��Сʱ������������ʱ������������û�����ռ����㹻��������ǰ���������Ѳ����������������⣬�������� core dump �ļ��������һ��ԭ��

����󼸷��ӣ������ռ���һЩ��Ϣ��ij�� lua �������� C �����е���ѭ������ skynet ����̨�� signal �޷��ж�����skynet �� signal �����ж� lua vm ������ ������ log �������ڴ汩����ͻ���ģ�������һ˲��Թ��������ڴ棬�������ۻ���

��һ��崻���Ѹ�������˷�������ͬʱ��������ͬ�������˻�����ѹ�����ԣ��������������������������������޷����ֹ��ϡ�

������¼��У��ҷ����� skynet �ռ�����ʱ�¹ʹؼ���Ϣ�IJ��㣬�Ͻ������˼������߽ű���

���磬skynet ����̨�Ĺ۲�ÿ������״̬���ڴ�ʹ������Ŀ���ָ���ͨ��ѭ����ÿ�������������ɸ�������ֱ�㱨Ȼ���������ġ�һ��ij��������ѭ�����ͻ�����������̣�����û�л��ܱ��������

���������⵹�Dz����ӣ�ֻ��Ҫ�ֱ��ռ���Ϣ�����ó�ʱʱ�䣬Ȼ��Ϳ��Եõ����ֱ��棬����֪����ʱ�������ڣ�����Ҫ�� log �в�ѯ��ѭ�����档û������׼��������ű�������ͻ���¼���û�ܼ�ʱ������


���磬�������֡���η��ּ�ʱ����������������������������Ѹ�ٵIJ鵽����ѭ���ķ��񣬲��� gdb ֱ�� attach �����̵��ԡ����ֹ����߳̿����ڸ÷���� lua gc �����У��ڱ���һ������޴�� table ��

lua �� GC ��Ȼ�Dz���ʽ�ģ������ڱ������� table ���������ԭ�ӵġ��� table ��С�ﵽ���ڸ� slot ʱ���������ͱ�ü�����������Ϊ���Ѿ������������ڴ�ķ�Χ��ʹ���˽���������ʵ������������б�����

����ȷ������������ vm ����������ף��� table �Ե��� 90% ���ϵ��ڴ档�ӵ���ջ���ǿ��Կ�����������ڴ���һ����Ϊ 15 �ֽڵ��ⲿ��Ϣ������ log ��Ҳ��ʾ������������ѭ������Ϣ�ĵ�ַ�ͳ��ȣ�δ������ֱ���� log �� dump �����ݣ�

���ǵ�ͨѶʹ�õ� sproto Э�� �����Ժܿ��дһ��С�ű��� sproto decode �� 15 �ֽھͻ�ԭ���ֳ���

ԭ������Ϊij����ڹ�����Ϸ��Ʒʱ��������һ��������������ֵ�����������ڴ��������ʱ��������һ�� O(n) �� for ѭ�������ġ��ڴ��������У����ϵ���һ����ʱ table insert ���ݡ�����������ﵽ����ʱ����Ȼ�ͳԹ��������ڴ档

�����׷��ϸ�ڵĻ�������������ģ�

lua �� table �����鲿������װ���󣬷������ӵġ��������㹻���һ�η����ͻ����̴��� gc ���� gc �ֻ���� vm �����ж���һ��ʹ���˽�����������ô�������� table �ͻ����̴���潻�����ڴ����������Ҫ copy һ�ε��µ��ڴ�ռ䣬�������ѭ�����зdz�������


һ������ķ����ǣ�һ�� gdb attach ��ȥ��������������̺߳󣬷�������Ȼ��������ˣ���ȫ��Ӱ�������Ϸ������ԭ������Ϊ���� gc ����󣬲��ٱ����ڴ棬����ʱ�ڴ�����������Թ�����ҵ�����С��� skynet ���õ��Ƕ๤���߳�ƽ�ȵ��ȵķ�����ÿ�������߳�����Ҫ��ʱ���ȥȡ��ɣ�����û��Ϊÿ�������̵߳���������Ϣ���У���Ӱ��Ľ�����һ���û���ʵ��������û��������ߣ��������������κ�������������С�

������ʱ��ֱ��ͣ����������̣߳���©�����޸�����������ȫ��������������ȥ������������Ǹ÷���� lua vm �޷����ա����Ը��Ѻõķ����ǽ��������Ĺط����̣������ȫ�����ߺ�ɱ���������̡�


��������¹ʣ��Ҿ��� skynet �б�Ҫ����һ�������ԣ��������������Ƶ��� lua vm ʹ���ڴ�Ĵ�С��

��Ȼ skynet �Ѿ���׼������ 1.0 �� ��ԭ���ϲ����������ԡ����Ҿ������̫��Ҫ�ˣ�����������ʽ��֮��İ汾�У��������̼����ˡ�ѡ���õĻ���������̫�ั���á�

������ʹ�÷�����https://github.com/cloudwu/skynet/blob/master/test/testmemlimit.lua ��

�����Ҫ�����������ڽű�һ��ʼ�͵��� skynet.memlimit �������ޣ���λ���ֽ�����һ���� VM ʹ�ó���������ƣ��ͻ��׳��ڴ����һ������£���� vm ����������������������һЩ�˳��Ĺ�����������Ϊ����ͨ������Ϊ table ��������һ�����������ڴ�IJ�������ġ�һ����������Ȼ��ǰִ�����̱���ϣ������� skynet ���õ��Ƕ��� coroutine ������ͬ����Ϣ��������Ϣ���ɿ������������������㹻���ڴ�ʹ�á�

���˽��������Ҵ������񣬿����������޵� 128 M ���ҡ���Ȼ�Թ������飬���������ͨ��Ӧ������ 10M ���¡�


���⣬����Ĭ�ϻ���ÿ�� vm ʹ�� 32M / 64M / 128 M (���η���) ... �ڴ�ʱ��дһ�� log ��Ϊ���棬���㿪�����ų��������⡣


ps. �º����Dz�ѯ���������� bug ���û�����������ͬ���û���ʹ�õIJ�ͬ���豸��