memcached 数据传输时间问题

RootDeep 2015-11-22 01:12:09
大家好!

我近日遇到一个关于Memcached 连接池使用的棘手问题,使用背景如下:

我在memcached server 端存储大概20000 个64kb 的数据。然后在客户端(Python 客户端)并发(大概1500次/s)请求随机读这些数据。在获取这些数据时,我使用了两种不同的方式。一种是使用连接池的方式,一种是不适用连接池的方式。整体来看,使用连接池的方式性能稍微好一点,(一定的时间下,连接池的方式处理的读请求比非连接池的方式多一些,客户端接受的数据多一些),但是现在问题来了:

在使用连接池的方式中,每一个读请求等待数据的平均时间比不建连接池的方式较长一些,这种现象出现于上述并发模式下。具体统计读时间的代码段如下(见红色代码):

def _unsafe_get():
self._statlog(cmd)
try:
cmd_bytes = cmd.encode() if six.PY3 else cmd
fullcmd = b''.join((cmd_bytes, b' ', key))
server.send_cmd(fullcmd)
rkey = flags = rlen = cas_id = None
if cmd == 'gets':
rkey, flags, rlen, cas_id, = self._expect_cas_value(
server, raise_exception=True
)
if rkey and self.cache_cas:
self.cas_ids[rkey] = cas_id
else:​
rkey, flags, rlen, = self._expectvalue(
server, raise_exception=True
)


if not rkey:
return None
try:

start_time= time.time()​
value = self._recv_value(server, flags, rlen)

get_time = time.time()-start_time


finally:
server.expect(b"END", raise_exception=True)
except (_Error, socket.error) as msg:
if isinstance(msg, tuple):
msg = msg[1]
server.mark_dead(msg)
return None
return value

64KB的数据我只需要一次get就可以拿到,也就是上述代码对每一个读请求只会执行一次。经观察,并发情况下,

1. 网络带宽并未饱和,该并发读请求时,一般能达到90MB/s 左右;

2. 服务器端,和客户端CPU利用率也较低,并且服务端内存足够大。


现在我不清楚问题是什么地方导致了这种现象的发生,希望有人对此作出合理解释,并提供验证方法。
...全文
64 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,114

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧