简单调用skynet的QPS的记录,仅供参考。
1. 简单调用 math.random
local math = require "math"
local skynet = require "skynet"
skynet.start(function()
local v = nil
local count = 0
local t = skynet.now()
while skynet.now() - t < 100*10 do
count = count + 1
v = math.random(3,3)
end
local time = (skynet.now()-t) / 100
print("v", v)
print("time", time, "count", count, "per", count/time)
end)
结果
time 1.0 count 10889947 per 10889947.0
2. 简单调用 skynet.call
local skynet = require "skynet"
require "skynet.manager" -- import skynet.register
skynet.start(function()
local sdb = skynet.newservice("simpledb", "agent")
skynet.call("SIMPLEDB", "lua", "SET", "a", "foobar")
local v = nil
local count = 0
local t = skynet.now()
while skynet.now() - t < 100*10 do
count = count + 1
v = skynet.call("SIMPLEDB", "lua", "GET", "a")
end
local time = (skynet.now()-t) / 100
print("v", v)
print("time", time, "count", count, "per", count/time)
skynet.exit()
end)
结果
time 10.0 count 1021166 per 102116.6
3. 简单调用 cluster.call
local skynet = require "skynet"
require "skynet.manager" -- import skynet.register
local cluster = require "skynet.cluster"
skynet.start(function()
local sdb = skynet.newservice("simpledb", "agent")
skynet.call("SIMPLEDB", "lua", "SET", "a", "foobar")
cluster.open "db"
cluster.register("sdb", sdb)
local proxy = cluster.proxy "db@sdb"
local v = nil
local count = 0
local t = skynet.now()
while skynet.now() - t < 100*10 do
count = count + 1
-- v = cluster.call("db", "SIMPLEDB", "GET", "a")
v = skynet.call(proxy, "lua", "GET", "a")
end
local time = (skynet.now()-t) / 100
print("v", v)
print("time", time, "count", count, "per", count/time)
skynet.exit()
end)
结果
time 10.0 count 52784 per 5278.4
4. 简单调用 redis mq
service服务 simplemq.lua
local skynet = require "skynet"
require "skynet.manager" -- import skynet.register
local redis = require "skynet.db.redis"
local conf = {
host = "127.0.0.1" ,
port = 6379 ,
db = 11
}
local function process()
print("process...")
local db = redis.connect(conf)
while true do
local task_json = db:brpop("test_queue", 0)
-- print("task_json", task_json[2])
db:lpush(task_json[2], "secessed")
end
end
skynet.start(function()
skynet.dispatch("lua", function(session, address, cmd, ...)
cmd = cmd:upper()
if cmd == "PING" then
assert(session == 0)
local str = (...)
if #str > 20 then
str = str:sub(1,20) .. "...(" .. #str .. ")"
end
skynet.error(string.format("%s ping %s", skynet.address(address), str))
return
end
local f = command[cmd]
if f then
skynet.ret(skynet.pack(f(...)))
else
error(string.format("Unknown command %s", tostring(cmd)))
end
end)
skynet.timeout(
100,
function()
process()
end
)
end)
调用测试
local skynet = require "skynet"
require "skynet.manager" -- import skynet.register
local cluster = require "skynet.cluster"
local redis = require "skynet.db.redis"
local conf = {
host = "127.0.0.1" ,
port = 6379 ,
db = 11
}
-- 添加任务到任务队列
local function call(db, queue_name, task_name)
db:lpush(queue_name, task_name)
local result = db:brpop(task_name, 3)
return result[2]
end
skynet.start(function()
skynet.newservice("simplemq", "agent")
local db = redis.connect(conf)
local v = nil
local count = 0
local t = skynet.now()
while skynet.now() - t < 100*10 do
count = count + 1
v = call(db, "test_queue", "test_queue_result_".. tostring(skynet.now()))
end
local time = (skynet.now()-t) / 100
print("v", v)
print("time", time, "count", count, "per", count/time)
skynet.exit()
end)
结果
time 10.0 count 13821 per 1382.1
5. 结果列表:
调用 | QPS | 相对于上项的% | 备注 |
---|---|---|---|
math.random | 10889947.0 | - | |
skynet.call | 102116.6 | 0.94 | - |
cluster.call | 5278.4 | 5.17 | - |
redis mq | 1382.1 | 26.17 | redis满载了,skynet单核70%,用python测试也差不多 |