插座性能高峰

时间:2010-03-26 07:11:59

标签: networking sockets tcp

我们正面临着使用IPC套接字的高吞吐量事务处理系统中的随机峰值。

以下是用于运行的设置:

  1. 客户端为每个事务打开和关闭新连接,服务器和客户端之间有4个交换。
  2. 我们已经通过getsockopt设置套接字逗留(TIME_WAIT)选项来禁用SO_LINGER,因为我们认为尖峰是由于TIME_WAIT中的套接字等待而引起的。
  3. 此交易没有处理。只传递消息。
  4. 操作系统使用Centos 5.4
  5. 平均往返时间约为3毫秒,但有时往返时间范围从100毫秒到几秒。

    用于执行和测量以及输出的步骤

    1. 启动服务器

      $ python sockServerLinger.py> / dev / null&

    2. 启动客户端向服务器发布100万个事务。并在client.log文件中记录事务的时间。

      $ python sockClient.py 1000000> client.log

    3. 执行完成后,以下命令将以<line_number>:<execution_time>格式显示大于100毫秒的执行时间。

      $ grep -n“0. [1-9]”client.log |少

    4. 以下是服务器和客户端的示例代码。

      服务器

      # 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
      

1 个答案:

答案 0 :(得分:1)