修改memtier-benchmark支持压测多进程
29 Jun 2024
|
|
看了社区issue不打算支持,只好自己写了
另外 @suxb201 指出写脚本多进程memtier分别压也能满足需求,确实,我脑抽了没这么想
如果写脚本不满足,再采用本文描述的方法吧
使用方式 -H host1:port1,host2:port2 逗号分隔不同ip_port 冒号分隔ip和port
./memtier_benchmark -H 127.0.0.1:6371,127.0.0.1:6372,127.0.0.1:6373 -c 30 -n 1000000
注意 -c 客户端数要比服务列表多一些
如果你也要改,我告诉你改哪里
首先配置项,改config_parse_args
代码运行结构是cg_thread - client_group - client - shared_connection
咱们这里改的是client,具体来说是client::connect
本来是要连一个ip,这里咱们就轮训指定的ip列表,所以指定的client要多一些,起码大于服务列表数
这里是轮训创建的,其实也可以设计一些特殊的访问模式,轮训比较简单,定义个static count循环就行了
static int count = 0;
auto idx = count % m_config->server_list_num;
auto c = m_config->server_list_addr[idx];
if (c == nullptr || c->get_connect_info(&addr) != 0) {
benchmark_error_log("connect: resolve error\n");
return -1;
}
// Just in case we got domain name and not ip, we convert it
char address[INET6_ADDRSTRLEN];
if (addr.ci_family == PF_INET) {
struct sockaddr_in *ipv4 = (struct sockaddr_in *)addr.ci_addr;
inet_ntop(AF_INET, &(ipv4->sin_addr), address, INET_ADDRSTRLEN);
} else {
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)addr.ci_addr;
inet_ntop(AF_INET6, &(ipv6->sin6_addr), address, INET6_ADDRSTRLEN);
}
// save address and port
sc->set_address_port(address, c->m_port_str.c_str());
count++;
这里我遇到个bug,在mac平台无法解决
调用get_connect_info会走到getaddrinfo和freeaddrinfo 成对的,freeaddrinfo挂
考虑到connect不频繁,注释了,差不多得了
还是比较简单的。不过调试崩溃调了好久没解决,注释了
if (!m_used_addr) {
if (m_server_addr) {
- freeaddrinfo(m_server_addr);
- m_server_addr = NULL;
+ // mac has bug, always coredump here
+ // fuck it, just leak
+ //freeaddrinfo(m_server_addr);
+ //m_server_addr = NULL;
}
## PS
mac不能用gdb lldb第一次调试环境很麻烦, 不配置不生成文件
```bash
ulimit -c unlimited
sudo chmod -R g+w /cores
sudo chgrp -R admin /cores
#可以了
lldb --core /cores/core.73219 memtier_benchmark