benchmarks -- Zoom.Quiet [2004-08-09 23:57:27]

1. 优化讨论

主要针对客户端

  • b%gnsq1--Benchmarks/gnsd|c 测试1

1.1. 0729版本

   1 # -*- coding: utf-8 -*-
   2 #
   3 #
   4 # $Id: ussc.py,v 1.3 2004/07/28 10:23:34 hd Exp $
   5 
   6 from uss.message import usspmsg
   7 from uss.protocols import ussp
   8 from twisted.internet import reactor, protocol, defer
   9 from time import clock
  10 
  11 class USSClientProtocol(ussp.USSProtocol):
  12     def connectionMade(self):
  13         message = usspmsg.USSPMessage()
  14         message.setMsgName('connect')
  15         message.body.setField('system_id','123456')
  16         message.body.setField('auth_source','1234567890123456')
  17         message.body.setField('version',0x0100)
  18         message.body.setField('time_stamp','12345678')
  19         self.sendData(message.packed())
  20 
  21     def on_ussp_connect_resp(self, message):
  22         print "Connect successfully"
  23         global nownum
  24         global count
  25 #        while (nownum < count):
  26         defer.succeed(self.testserver(str(nownum)))
  27 #        nownum += 1
  28 #        if(nownum >= count)
  29 #           self.disconnect()
  30 
  31     def on_ussp_terminate_resp(self, message):
  32         # 完事了!!!断开丫的连接
  33         self.transport.loseConnection()
  34 
  35     def on_ussp_mail_counter_resp(self, message):
  36         global getnum
  37         global lastuid
  38         global nownum
  39         lastuid = message.body.fields['uid']
  40         getnum += 1
  41         if getnum >= count:
  42             self.disconnect()
  43         nownum += 1
  44         defer.succeed(self.testserver(str(nownum)))
  45 
  46     def testserver(self,uid):
  47         message = usspmsg.USSPMessage()
  48         message.setMsgName('mail_counter')
  49         message.body.setField('uid',uid)
  50         self.sendData(message.packed())
  51 
  52     def disconnect(self):
  53         message = usspmsg.USSPMessage()
  54         message.setMsgName('terminate')
  55         self.sendData(message.packed())
  56 
  57 class USSClientFactory(protocol.ClientFactory):
  58     protocol = USSClientProtocol
  59 
  60     def clientConnectionFailed(self, connector, reason):
  61         print "Connection failed - goodbye!"
  62         reactor.stop()
  63 
  64     def clientConnectionLost(self, connector, reason):
  65         print "Connection lost"
  66         reactor.stop()
  67         pass
  68 
  69 def main():
  70     f = USSClientFactory()
  71     global count
  72     count = 0xffff
  73     global nownum
  74     nownum = 0
  75     global lastuid
  76     lastuid = ''
  77     global getnum
  78     getnum = 0
  79     reactor.connectTCP("127.0.0.1", 7890, f)
  80     start = clock()
  81     reactor.run()
  82     print "测试数据:%10d 条" %nownum
  83     print "收到 %d 条" %getnum
  84     print "最后收到uid为:%s" %lastuid
  85     print "用时:%.2f 秒" %(clock()-start)
  86     print "每秒: %.2f 条" %(getnum / (clock()-start))
  87 
  88 if __name__ == "__main__":
  89     main()

1.2. 0731版本

   1 # -*- coding: utf-8 -*-
   2 #
   3 #
   4 # $Id: ussc.py,v 1.5 2004/07/29 08:02:06 hd Exp $
   5 
   6 from uss.message import usspmsg
   7 from uss.protocols import ussp
   8 from twisted.internet import reactor, protocol, defer
   9 from time import clock
  10 import Queue
  11 
  12 # 定义了滑动窗口的大小
  13 WINMAX = 1024
  14 
  15 class USSClientProtocol(ussp.USSClientQueueProtocol):
  16     """建立一个USS客户机的协议处理"""
  17     def connectionMade(self):
  18         """连接成功后开始发送报文"""
  19         # 先发一个connect报文进行握手
  20         message = usspmsg.USSPMessage()
  21         message.setMsgName('connect')
  22         message.body.setField('system_id','123456')
  23         message.body.setField('auth_source','1234567890123456')
  24         message.body.setField('version',0x0100)
  25         message.body.setField('time_stamp','12345678')
  26         self.sendDataToQueue(message)
  27         ussp.USSClientQueueProtocol.connectionMade(self)
  28 
  29     def on_ussp_connect_resp(self, message):
  30         """服务器返回了connect的resp报文"""
  31         print "Connect successfully"
  32         defer.succeed(self.testserver())
  33 
  34     def on_ussp_terminate_resp(self, message):
  35         # 完事了!!!断开丫的连接
  36         self.transport.loseConnection()
  37 
  38     def on_ussp_mail_counter_resp(self, message):
  39         """服务器返回了mail_counter的resp报文"""
  40         global getnum
  41         global lastuid
  42         lastuid = message.body.fields['uid']
  43         getnum += 1
  44 
  45     def testserver(self):
  46         """向服务器发的测试报文"""
  47 
  48         global nownum
  49         global count
  50 
  51         while nownum < count:
  52             message = usspmsg.USSPMessage()
  53             message.setMsgName('mail_counter')
  54             message.body.setField('uid',str(nownum))
  55             if self.factory.sendQueue.full():
  56                 self.call = reactor.callLater(0, self.testserver)
  57                 return
  58             else:
  59                 self.factory.sendQueue.put_nowait(message)
  60                 nownum += 1
  61 
  62         self.disconnect()
  63 
  64     def disconnect(self):
  65         """发完测试报文后发送terminate报文让服务器断开连接"""
  66         message = usspmsg.USSPMessage()
  67         message.setMsgName('terminate')
  68         self.sendDataToQueue(message)
  69 
  70 class USSClientFactory(protocol.ClientFactory):
  71     protocol = USSClientProtocol
  72 
  73     def __init__(self):
  74         # 滑动窗口的大小
  75         self.WINMAX = WINMAX
  76         # 等待发送的报文队列
  77         self.sendQueue = Queue.Queue(self.WINMAX)
  78         # 已经发出的报文序列ID
  79         self.sendMsg = []
  80         # 使用的消息ID
  81         self.sequence = 1
  82 
  83     def clientConnectionFailed(self, connector, reason):
  84         print "Connection failed - goodbye!"
  85         reactor.stop()
  86 
  87     def clientConnectionLost(self, connector, reason):
  88         print "Connection lost"
  89         reactor.stop()
  90         pass
  91 
  92 def main():
  93     f = USSClientFactory()
  94     global count
  95     count = 0xffff
  96     global nownum
  97     nownum = 0
  98     global lastuid
  99     lastuid = ''
 100     global getnum
 101     getnum = 0
 102     reactor.suggestThreadPoolSize(30)
 103     reactor.connectTCP("192.168.2.237", 7890, f)
 104     #reactor.connectTCP("127.0.0.1", 7890, f)
 105     start = clock()
 106     reactor.run()
 107     print "测试数据:%10d 条" %nownum
 108     print "收到 %d 条" %getnum
 109     print "最后收到uid为:%s" %lastuid
 110     print "用时:%.2f 秒" %(clock()-start)
 111     print "每秒:%f条" %(nownum / (clock()-start))
 112 
 113 if __name__ == "__main__":
 114     main()

1.2.1. ussp.py

   1 # -*- coding: utf-8 -*-
   2 #
   3 #
   4 # $Id: ussp.py,v 1.2 2004/07/28 08:36:29 hd Exp $
   5 
   6 """Open Unified Storage System Protocol
   7 
   8 Stability: None
   9 
  10 @author: U{HD<mailto:[email protected]>}
  11 
  12 @see: Open Unified Storage System Protocol规范
  13 """
  14 from uss.protocols import byteprotocol
  15 from uss.message import usspmsg
  16 from twisted.internet import reactor
  17 
  18 class USSProtocol(byteprotocol.ByteMessageProtocol):
  19     """缺省USS协议实现"""
  20     def MessageReceived(self,packet):
  21         """接收到一条消息,对该消息进行处理"""
  22         message = usspmsg.USSPMessage()
  23         message.loadMessage(packet)
  24         # print message
  25         self.MessageProcess(message)
  26 
  27     def MessageProcess(self, message):
  28         """调用指定的方法来处理收到的消息"""
  29         method = getattr(self , "on_ussp_%s" % message.msgname, None)
  30         return method(message)
  31 
  32 class USSClientQueueProtocol(USSProtocol):
  33     """使用滑动窗口队列的USS协议客户端实现"""
  34 
  35     def MessageReceived(self,packet):
  36         """接收到一条消息,确定该消息是否是已发送出的消息,
  37         如果是,从发送消息队列中清除该消息。然后按正常的流程执行下去。
  38         """
  39         message = usspmsg.USSPMessage()
  40         message.loadMessage(packet)
  41         # print message
  42         # 将发出的消息从队列中清楚
  43         self.factory.sendMsg.remove(message.head.sequence)
  44         self.MessageProcess(message)
  45 
  46     def connectionMade(self):
  47         """连接成功了,就可以启动发送线程了"""
  48         reactor.callInThread(self.sendQueueMesg)
  49 
  50     def sendDataToQueue(self, message):
  51         """将消息加入待发送队列"""
  52         if(not self.factory.sendQueue.full()):
  53             self.factory.sendQueue.put(message)
  54         else:
  55             self.call = reactor.callLater(0, self.sendDataToQueue, message)
  56 
  57     def sendQueueMesg(self):
  58         """将队列中的消息发送出去"""
  59         if (len(self.factory.sendMsg) < self.factory.WINMAX):
  60             while (not self.factory.sendQueue.empty()):
  61                 message = self.factory.sendQueue.get()
  62                 # 发送前设置消息的顺序号
  63                 message.head.sequence = self.factory.sequence
  64                 self.sendData(message.packed())
  65                 # 将已经发送的消息放入已经发送的清单中
  66                 self.factory.sendMsg.append(self.factory.sequence)
  67                 self.factory.sequence += 1
  68         self.call = reactor.callLater(0, self.sendQueueMesg)