Silly 是一个轻量、极简的服务器程序框架。
- 底层采用 C 和 Lua 混合开发,上层业务逻辑以 Lua 为主。
- 单进程单线程模型,契合传统游戏开发,避免多线程并发问题。
- 避免回调地狱,利用 Lua 协程处理异步调用。
采用redis-benchmark程序来进行并发测试。
测试机型为CPU:Intel(R) Core(TM) i5-4440 CPU @ 3.10GHz
.
测试代码结果如下:
====== PING_INLINE ======
100000 requests completed in 0.76 seconds
1000 parallel clients
3 bytes payload
keep alive: 1
0.00% <= 2 milliseconds
0.03% <= 3 milliseconds
70.15% <= 4 milliseconds
99.35% <= 5 milliseconds
99.70% <= 6 milliseconds
99.98% <= 7 milliseconds
100.00% <= 7 milliseconds
131926.12 requests per second
====== PING_BULK ======
100000 requests completed in 0.77 seconds
1000 parallel clients
3 bytes payload
keep alive: 1
0.00% <= 2 milliseconds
0.08% <= 3 milliseconds
87.33% <= 4 milliseconds
99.45% <= 5 milliseconds
99.76% <= 6 milliseconds
100.00% <= 6 milliseconds
130378.09 requests per second
apt-get install libreadline-dev
yum install readline-devel
make
./silly <main.lua> [options]
Silly 虽然在实现上采用了三个线程,但是线程之间并不共享数据,业务逻辑只会在一个线程中执行,因此业务层的感知依然是单进程单线程模型。
下面是 Silly 的工作原理:
-
Worker 线程:
- 工作在 Lua 虚拟机之上,负责处理所有通过 socket 和 timer 产生的事件。
- 事件触发后,Worker 线程将其转换为 Lua 层进行处理。
-
Socket 线程:
- 基于
epoll/kevent/iocp
提供高效的 socket 管理,封装了 socket 的数据传输、关闭和连接等事件。 - 支持最大 65535 个 socket 连接,且可以通过
silly_conf.h
文件中的宏SOCKET_MAX_EXP
来调整最大连接数。 - 可以轻松替换成其他需要的 IO 模型,符合
event.h
接口定义即可。
- 基于
-
Timer 线程:
- 提供高分辨率低精度的定时器,分变率默认分辨率为 10ms,精度为50ms。 可以通过修改
silly_conf.h
中的宏TIMER_RESOLUTION
和TIMER_ACCURACY
来调整定时器的分辨率和精度。
- 提供高分辨率低精度的定时器,分变率默认分辨率为 10ms,精度为50ms。 可以通过修改
Silly 提供了多个示例。
你可以运行如下脚本来启动不同的示例:
examples/start.sh http
examples/start.sh patch
examples/start.sh rpc
examples/start.sh socket
examples/start.sh timer
examples/start.sh websocket
如果你想一次性运行所有示例,可以执行:
examples/start.sh
所有模块的测试代码位于 test 文件夹中。你可以通过以下命令运行测试:
make testall
欢迎查看 Wiki 文档获取更多信息。