我们正面临着使用IPC套接字的高吞吐量事务处理系统中的随机峰值。
以下是用于运行的设置:
TIME_WAIT
)选项来禁用SO_LINGER
,因为我们认为尖峰是由于TIME_WAIT
中的套接字等待而引起的。平均往返时间约为3毫秒,但有时往返时间范围从100毫秒到几秒。
用于执行和测量以及输出的步骤
启动服务器
$ python sockServerLinger.py> / dev / null&
启动客户端向服务器发布100万个事务。并在client.log文件中记录事务的时间。
$ python sockClient.py 1000000> client.log
执行完成后,以下命令将以<line_number>:<execution_time>
格式显示大于100毫秒的执行时间。
$ grep -n“0. [1-9]”client.log |少
以下是服务器和客户端的示例代码。
服务器
# File: sockServerLinger.py
import socket, traceback,time
import struct
host = ''
port = 9999
l_onoff = 1
l_linger = 0
lingeropt = struct.pack('ii', l_onoff, l_linger)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, lingeropt)
s.bind((host, port))
s.listen(1)
while 1:
try:
clientsock, clientaddr = s.accept()
print "Got connection from", clientsock.getpeername()
data = clientsock.recv(1024*1024*10)
#print "asdasd",data
numsent=clientsock.send(data)
data1 = clientsock.recv(1024*1024*10)
numsent=clientsock.send(data)
ret = 1
while(ret>0):
data1 = clientsock.recv(1024*1024*10)
ret = len(data)
clientsock.close()
except KeyboardInterrupt:
raise
except:
print traceback.print_exc()
continue
客户
# File: sockClient.py
import socket, traceback,sys
import time
i = 0
while 1:
try:
st = time.time()
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
while (s.connect_ex(('127.0.0.1',9999)) != 0):
continue
numsent=s.send("asd"*1000)
response = s.recv(6000)
numsent=s.send("asd"*1000)
response = s.recv(6000)
i+=1
if i == int(sys.argv[1]):
break
except KeyboardInterrupt:
raise
except:
print "in exec:::::::::::::",traceback.print_exc()
continue
print time.time() -st
答案 0 :(得分:1)