我們正在面向使用IPC插座的高吞吐量事務處理系統中出現隨機尖峯。插座性能中的尖峯
下面是用於運行安裝程序:
- 客戶端打開和關閉對每一項交易新的連接,並有服務器和客戶端之間的交流4。
- 我們已經通過getsockopt設置套接口逗留(
SO_LINGER
)選項來禁用TIME_WAIT
,因爲我們認爲尖峯是由於套接字等於TIME_WAIT
而引起的。 - 沒有爲交易完成處理。只有消息被傳遞。
- OS中使用的Centos 5.4
平均往返時間是約3毫秒,但有時往返時間從100毫秒秒至幾秒鐘。用於執行測量和輸出
步驟
啓動服務器
$蟒蛇sockServerLinger.py>的/ dev/null的&
啓動客戶端後1百萬筆交易到服務器。並在client.log文件中記錄事務的時間。
$蟒sockClient.py百萬> client.log
一旦執行完成以下命令將顯示的執行時間比在格式
<line_number>:<execution_time>
100毫秒以上。$ grep -n「0. [1-9]」client.log | less
以下是服務器和客戶端的示例代碼。
服務器
# 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.5秒的值,並且在引發異常時,操作(connect或send或recv)在while循環中重試。這也表現了相同的方式(5秒是最大時間)。我們注意到,如果通信延遲大約5秒鐘,那麼它會引發異常10次和第11次操作成功。 如果您有任何其他建議,請讓我知道。 – 2010-03-27 02:29:15