int
ngx_http_lua_ffi_balancer_set_current_peer(ngx_http_request_t *r,
const u_char *addr, size_t addr_len, int port, char **err)
这这里,发现他只是把addr用ngx_parse_url,然后覆盖掉ngx_http_lua_main_conf_t对应的balancer_peer_data的值;
后面的处理都是nginx内部的;
ngx_memcpy(url.url.data, addr, addr_len);
url.url.len = addr_len;
url.default_port = (in_port_t) port;
url.uri_part = 0;
url.no_resolve = 1;
if (ngx_parse_url(r->pool, &url) != NGX_OK) {
if (url.err) {
*err = url.err;
}
return NGX_ERROR;
}
if (url.addrs && url.addrs[0].sockaddr) {
bp->sockaddr = url.addrs[0].sockaddr;
bp->socklen = url.addrs[0].socklen;
bp->host = &url.addrs[0].name;
} else {
*err = "no host allowed";
return NGX_ERROR;
}
--目前去除这段一切正常,加上set_current_peer就有异常, 何解?
在 2018年12月15日星期六 UTC+8下午3:12:01,leaf...@gmail.com写道:
-- my.lua, 移除了日志处理和错误处理部分----------
function string:addr(s)
local _start, _end = self:find(s or ":")
return (_start ~= nil) and self:sub(1, _start - 1) or self,
(_end ~= nil) and self:sub(_end + 1) or ''
end
local ups = require('ngx.upstream')
local backend = ups.current_upstream_name()
local peers = ups.get_primary_peers(backend)
local idx = math.random(1, table.getn(peers))
local sel = peers[idx]['name'];
dbg(backend..', '..sel)
local balancer
= require "ngx.balancer"
local ok, err = balancer.set_current_peer(sel:addr())
if not ok then
dbgWriteFile('fatal', "failed to set the current peer: "..err)
return ngx.exit(601)
end
local _M = {} -- wrapper
function _M.balancer() xpcall(_balancer, _handler) end
return _M
在nginx.conf里----------------,
upstream testor {
balancer_by_lua_block {
local r = require "mylua"
r.balacer()
}
server ..., (这里是5个endpoint)
}
upstream的后端endpoint服务是个非常简单的服务,只会返回200;
去除其他所有逻辑以后,只在balancer_by_lua_block里上面的处理构成。
在请求量每秒5000的压测里, 每30秒统计一次请求结果。发现大约10分钟左右出现一次http错误, 之后恢复;
以后每10~20分钟,重复出现, 每次出现http请求返回错误2%的错误率、出现时nginx和后端节点的资源使用率都不超出60%, 后端endpoint服务正常。
这种情况应该怎么定位, 是垃圾回收还是nginx有什么任务调度导致?