Imp: enlarge time wheel span from 2m to 15m
diff --git a/change_log.md b/change_log.md
deleted file mode 100644
index 8aaf195..0000000
--- a/change_log.md
+++ /dev/null
@@ -1,417 +0,0 @@
-# getty #
----
- *a netty like asynchronous network I/O library*
-
-## introdction ##
----
-> DESC       : a asynchronous network I/O library in golang. In getty there are two goroutines in one connection(session),
-               one handle network read buffer tcp stream, the other handle logic process and write response into network
-               write buffer. If your logic process may take a long time, you should start a new logic process goroutine
-               by yourself in (Codec):OnMessage. Getty is based on "ngo" whose author is sanbit(https://github.com/sanbit).
->
-> LICENCE    : Apache License 2.0
-
-## develop history ##
----
-
-- 2019/06/08
-    > Improvement
-    * add task worker pool
-    
-- 2019/06/07
-    > Improvement
-    * use time.After instead of wheel.After
-    * add remark for tcp reading
-
-- 2018/10/16
-    > Feature
-    * add rpc/micro CallOneway/AsyncCall
-    * version: v1.0.3
-
-- 2018/08/19
-    > Feature
-    * use multiple service config in service configuration
-    * do not register consumer
-    * version: v1.0.2
-
-- 2018/08/16
-    > Feature
-    * Add gxpool.watcher filter
-
-- 2018/08/13
-    > Feature
-    * Add Micro
-
-- 2018/08/07
-    > Improvement
-    * RPC package format:  {2 Bytes Header len + Header + 2 Body len + Body} ---> {Header + Body}
-    > Bug Fix
-    * do not encode body if package body is nil
-
-- 2018/07/01
-    > Feature
-    * Add RPC
-
-- 2018/06/25
-    > buf fix
-    * Using juju/errors.Cause on read/write in case of network i/o timeout
-
-- 2018/03/29
-    > improvement
-    * use juju/errors instead of pkg/errors
-
-- 2018/03/20
-    > bug fix
-    * ignore connectPingPackage
-
-- 2018/03/19
-    > improvement
-    * use gxnet.IsSameAddr
-    * send out pkg asap in WritePkg when the second parameter @timeout is not greater then 0.
-    * delete Chinese commenting
-    * gettyConn:readCount -> gettyConn:readBytes
-    * gettyConn:writeCount -> gettyConn:writeBytes
-    * gettyConn:readPkgCount -> gettyConn:readPkgNum
-    * gettyConn:writePkgCount -> gettyConn:writePkgNum
-
-- 2018/03/18
-    > improvement
-    * nerr -> netError
-    * check udp connection alive after connect()
-    * use ReadFromUDP as the uniform UDP read interface
-    * close net.UDPConn when connected failed
-    * close net.Conn when connected failed
-    * Session::EndPointType() ->  Session::EndPoint()
-    * time.Sleep() -> wheel.After()
-    * do not check server.go:server::caCert
-
-- 2018/03/17
-    > improvement
-    * add end point type
-    * add ClientOptions & Client
-    * add ServerOptions & Server
-    * delete peerAddr of UDPSession
-    * version 0.8.2
-
-- 2018/03/16
-    > bug fix
-    * set maxMsgLen of UDPSession from zero to 4k
-
-- 2018/03/15
-    > improvement
-    * add gettyUDPConn to session::Conn and session::gettyConn
-
-- 2018/03/14
-    > bug fix
-    * disable SetReadDeadline when enable compression.
-
-        Refers to the NextReader/NextWriter of gorilla/websocket, you should make a new compression reader/writer when
-        read/write a package again.
-
-- 2018/03/10
-    > improvement
-    * 1 rDeadline -> rTimeout
-    * 2 wDeadline -> wTimeout
-    * 3 disable readtimeout in gettyWSConn:read
-    * 4 add gettyWSConn:updateWriteDeadline
-    * 5 add timeout for Session:WritePkg
-
-- 2018/03/08
-    > feature
-    * 1 add udp client and udp server
-
-    > version: 0.8.01
-
-- 2017/05/02
-    > feature
-    * 1 set read/write deadline for every read/write action refers to fasthttp
-
-    > version: 0.7.04
-
-- 2017/04/27
-    > bug fix
-    * 1 client connect wss server just using the cert file.
-
-    > version: 0.7.03
-
-- 2017/04/21
-    > bug fix
-    * 1 client can not connect wss server because of getty does not verify whether cert&key is nil or not in client.go:dialWSS
-
-    > version: 0.7.02
-
-- 2017/02/08
-    > improvement
-    >
-    > 1 server shutdown in server.go:(Server) stop()
-    >
-    > 2 session variable -> ss
-    >
-    > 3 RunWSEventLoopWithTLS -> RunWSSEventLoop
-    >
-    > 4 version: 0.7.01
-
-- 2017/02/03
-    > 1 Session struct -> session struct and add Session interface
-    >
-    > 2 change receiver name from this to a alphabet letter
-    >
-    > 3 add compression type
-    >
-    > 4 version: 0.7.0
-
-- 2016/11/19
-    > 1 add conn.go:(*gettyWSConn) setCompressType to add zip compress feature for ws connection
-    >
-    > 2 version: 0.6.02
-
-- 2016/11/16
-    > 1 add zip/snappy compress for tcp connection
-    >
-    > 2 version: 0.6.01
-
-- 2016/11/02
-    > 1 add session.go:Session{ID(), LocalAddr(), RemoteAddr()}
-    >
-    > 2 add conn.go:iConn{id(), localAddr(), remoteAddr()}
-    >
-    > 3 version: 0.4.08
-
-- 2016/11/01
-    > 1 session.go:Session{maxPkgLen(int)} -> Session{maxPkgLen(int32)}
-    >
-    > 2 add remarks in session.go
-    >
-    > 2 version: 0.4.07(0.4.06 is a obsolete version)
-
-- 2016/10/21
-    > 1 session.go:(Session)RunEventLoop -> session.go:(Session)run
-    >
-    > 2 version: 0.4.05
-
-- 2016/10/14
-    > 1 add conn.go:(gettyWSConn)handlePing
-    >
-    > 2 add conn.go:(gettyWSConn)handlePong
-    >
-    > 3 set read/write timeout in session.go:(Session)stop to let read/write timeout asap
-    >
-    > 4 fix bug: websocket block on session.go:(Session)handleWSPkg when got error. set read/write timeout asap to solve this problem.
-    >
-    > 5 version: 0.4.04
-
-- 2016/10/13
-    > 1 add conn.go:(gettyWSConn)writePing which is invoked automatically in session.go:(Session)handleLoop
-    >
-    > 2 modify session.go:(Session)handleLoop:Websocket session will send ping frame automatically every peroid.
-    >
-    > 3 add conn.go:(gettyConn)UpdateActive, which can used as (Session)UpdateActive which is invoked by Session automatically.
-    >
-    > 4 add conn.go:(gettyConn)GetActive, which can used as (Session)GetActive
-    >
-    > 5 modify conn.go:gettyWSConn{websocket.Conn} ->  conn.go:gettyWSConn{*websocket.Conn}
-    >
-    > 6 version: 0.4.03
-
-- 2016/10/11
-    > 1 fix bug: use websocket.BinaryMessage in conn.go:(gettyWSConn)write
-    >
-    > 2 version: 0.4.02
-
-- 2016/10/10
-    > 1 delete session.go:Session{errFlag} to invoke codec.go:EventListener{OnClose&OnError} both when got a error
-    >
-    > 2 modify session.go:(Session)SetReader
-    >
-    > 3 modify session.go:(Session)SetWriter
-    >
-    > 4 add modify session.go:(Session)maxMsgLen for websocket session
-    >
-    > 5 version: 0.4.01
-
-- 2016/10/09
-    > 1 add client.go:NewWSSClient
-    >
-    > 2 add server.go:RunWSEventLoopWithTLS
-    >
-    > 3 add session.go:(Session*)gettyConn
-
-- 2016/10/08
-    > 1 add websocket connection & client & server
-    >
-    > 3 version: 0.4.0
-
-- 2016/10/01
-    > 1 remark SetReadTimeout & SetWriteTimeout in session.go (ref: https://github.com/golang/go/issues/15133)
-    >
-    > 3 version: 0.3.14
-
-- 2016/09/30
-    > 1 modify wheel time interval from 1 second to 100ms.
-    >
-    > 2 modify session.go:(Session)WritePkg timeout
-    >
-    > 3 version: 0.3.13
-
-- 2016/09/27
-    > 1 fix bug: getty panic when conn.RemoteAddr() is nil in session.go:(Session)sessionToken()
-    >
-    > 2 version: 0.3.12
-
-- 2016/09/26
-    > 1 move utils.go's function to github.com/AlexStocks/goext and delete it
-    >
-    > 2 use goext/time Wheel
-    >
-    > 3 version: 0.3.11
-
-- 2016/09/20
-    > 1 just invoke OnError when session got error
-    >
-    > 2 version: 0.3.10
-
-- 2016/09/19
-    > 1 move empty to from client.go to session.go
-    >
-    > 2 version: 0.3.09
-
-- 2016/09/12
-    > 1 add defeat self connection logic in client.go & server.go
-    >
-    > 2 version: 0.3.08
-
-- 2016/09/09
-    > 1 delete session.go:(Session)readerDone
-    >
-    > 2 delete session.go:(Session)handlePackage Last clause
-    >
-    > 3 set write timeout in session.go:(Session)WritePkg
-    >
-    > 4 version: 0.3.07
-
-- 2016/09/08
-    > 1 rewrite session.go:(Session)handlePackage() error handle logic
-    >
-    > 2 add utils.go:CountWatch
-    >
-    > 3 version: 0.3.06
-
-- 2016/09/07
-    > 1 session.go:(Session)Close() -> session.go:(Session)gc() to be invoked by session.go:(Session)handleLoop
-    >
-    > 2 add panic stack message for session.go:(Session)handleLoop & session.go:(Session)handlePackage
-    >
-    > 3 version: 0.3.05
-
-- 2016/09/06
-    > 1 codec.go:(Reader)Read(*Session, []byte) (interface{}, error)  -> codec.go:(Reader)Read(*Session, []byte) (interface{}, int, error)
-    >
-    > 2 codec.go:(EventListener)OnOpen(*Session) -> codec.go:(EventListener)OnOpen(*Session) error
-    >
-    > 3 version: 0.3.04
-
-- 2016/09/05
-    > 1 add 'errFlag = true' when got err in pkgHandler.Read loop clause in session.go:(Session)handlePackage
-    >
-    > 2 use '[]byte' instead of bytes.Buffer in codec.go:(Reader)Read
-    >
-    > 3 version: 0.3.03
-
-- 2016/09/04
-    > 1 add server.go:(Server)Listen
-    >
-    > 2 version: 0.3.02
-
-- 2016/09/03
-    > 1 modify return value of session.go:(Session)Close from void to error
-    >
-    > 2 add clause "this.attrs = nil" in session.go:(Session)Close
-    >
-    > 3 session.go:Session{*gettyConn, readTimeout, writeTimeout} -> session.go:Session{gettyConn, rTimeout, wTimeout}
-    >
-    > 4 add session.go:(Session)Reset
-    >
-    > 5 add session.go:(Session)SetConn
-    >
-    > 6 add elastic sleep time machanism in client.go:(Client)RunEventLoop
-    >
-    > 7 version: 0.3.01
-
-- 2016/09/02
-    > 1 add session.go:(gettyConn)close and session.go:(Session)dispose
-    >
-    > 2 modify return value of server.go:NewSessionCallback from void to err
-    >
-    > 3 add client.go:Client
-    >
-    > 4 version: 0.3.00
-
-- 2016/08/29
-    > 1 rename reconnect to errFlag in function session.go:(Session)handlePackage
-    >
-    > 2 session.go:(gettyConn)readBytes is reconsidered as read in tcp stream bytes
-    >
-    > 3 session.go:(gettyConn)writeBytes is reconsidered as write out tcp stream bytes
-    >
-    > 4 reconstruct session output token string session.go:(Session)sessionToken
-    >
-    > 5 use err instead of netError in session.go:(Session)handlePackage:defer:OnError
-    >
-    > 6 version: 0.2.07
-
-- 2016/08/25
-    > 1 move close done to once clause in server.go:(Server)stop
-    >
-    > 2 rename reqQ to rQ which means read queue and its relative params
-    >
-    > 3 rename rspQ to wQ which means write queue and its relative params
-    >
-    > 4 rename reqPkg to inPkg in function session.go:(Session)handleLoop
-    >
-    > 5 rename rspPkg to outPkg in function session.go:(Session)handleLoop
-    >
-    > 6 version: 0.2.06
-
-- 2016/08/24
-    > 1 delete session.go:Session:wg(atomic.WaitGroup). Add session.go:Session:grNum instead to prevent from  (Session)Close() block on session.go:Session:wg.Wait()
-    >
-    > 2 add once for session.go:Session:done(chan struct{})
-    >
-    > 3 version: 0.2.05
-
-- 2016/08/23
-    > 1 do not consider empty package as a error in (Session)handlePackage
-    >
-    > 2 version: 0.2.04
-
-- 2016/08/22
-    > 1 rename (Session)OnIdle to (Session)OnCron
-    >
-    > 2 rewrite server.go: add Server{done, wg}
-    >
-    > 3 add utils.go
-    >
-    > 4 version: 0.2.03
-
-- 2016/08/21
-    > 1 add name for Session
-    >
-    > 2 add OnError for Codec
-
-- 2016/08/18
-    > 1 delete last clause of handleRead
-    >
-    > 2 add reqQ handle case in last clause of handleLoop
-    >
-    > 3 add conditon check in (*Session)RunEventLoop()
-    >
-    > 4 version: 0.2.02
-
-- 2016/08/16
-    > 1 rename all structs
-    >
-    > 2 add getty connection
-    >
-    > 3 rewrite (Session)handleRead & (Session)handleEventLoop
-    >
-    > 4 version: 0.2.01
diff --git a/client.go b/client.go
index 8d7c8e4..a3d5fe8 100644
--- a/client.go
+++ b/client.go
@@ -24,9 +24,9 @@
 
 import (
 	"github.com/dubbogo/gost/bytes"
+	"github.com/dubbogo/gost/net"
 	"github.com/gorilla/websocket"
 	perrors "github.com/pkg/errors"
-	"github.com/dubbogo/gost/net"
 )
 
 const (
diff --git a/server.go b/server.go
index 2cc7dd9..14e37d9 100644
--- a/server.go
+++ b/server.go
@@ -23,9 +23,9 @@
 )
 
 import (
+	"github.com/dubbogo/gost/net"
 	"github.com/gorilla/websocket"
 	perrors "github.com/pkg/errors"
-	"github.com/dubbogo/gost/net"
 )
 
 var (
diff --git a/session.go b/session.go
index 85812db..260e2f5 100644
--- a/session.go
+++ b/session.go
@@ -30,12 +30,14 @@
 )
 
 const (
-	maxReadBufLen         = 4 * 1024
-	netIOTimeout          = 1e9      // 1s
-	period                = 60 * 1e9 // 1 minute
-	pendingDuration       = 3e9
-	defaultQLen           = 1024
-	maxIovecNum           = 10
+	maxReadBufLen    = 4 * 1024
+	netIOTimeout     = 1e9      // 1s
+	period           = 60 * 1e9 // 1 minute
+	pendingDuration  = 3e9
+	defaultQLen      = 1024
+	maxIovecNum      = 10
+	MaxWheelTimeSpan = 900e9 // 900s, 15 minute
+
 	defaultSessionName    = "session"
 	defaultTCPSessionName = "tcp-session"
 	defaultUDPSessionName = "udp-session"
@@ -49,9 +51,15 @@
 /////////////////////////////////////////
 
 var (
-	wheel = gxtime.NewWheel(gxtime.TimeMillisecondDuration(100), 1200) // wheel longest span is 2 minute
+	wheel *gxtime.Wheel
 )
 
+func init() {
+	span := 100e6 // 100ms
+	buckets := MaxWheelTimeSpan / span
+	wheel = gxtime.NewWheel(time.Duration(span), int(buckets)) // wheel longest span is 15 minute
+}
+
 func GetTimeWheel() *gxtime.Wheel {
 	return wheel
 }