memcached 数据传输时间问题
大家好!
我近日遇到一个关于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利用率也较低,并且服务端内存足够大。
现在我不清楚问题是什么地方导致了这种现象的发生,希望有人对此作出合理解释,并提供验证方法。