summaryrefslogtreecommitdiffhomepage
path: root/server
diff options
context:
space:
mode:
authorISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2016-01-16 16:40:05 +0900
committerISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>2016-01-16 18:25:35 +0900
commit6403c806634491b6cd6c3c90f61badf478fed9aa (patch)
treef557370a5c3ca739d644172140dd42af63cd1b00 /server
parent0cf8045e994b653030b721c574614d46c1870cf1 (diff)
server: reduce number of path.Clone() call to reduce memory footprint
the result of memory profile (500 route-server-clients each of them advertises 100 routes) before: (pprof) top5 3913.02MB of 3978.69MB total (98.35%) Dropped 148 nodes (cum <= 19.89MB) Showing top 10 nodes out of 11 (cum >= 21MB) flat flat% sum% cum cum% 2970.30MB 74.66% 74.66% 2975.80MB 74.79% github.com/osrg/gobgp/server.filterpath 810.09MB 20.36% 95.02% 810.59MB 20.37% github.com/osrg/gobgp/table.(*AdjRib).Update 115.60MB 2.91% 97.92% 119.10MB 2.99% github.com/osrg/gobgp/table.createUpdateMsgFromPath 10MB 0.25% 98.17% 1878.02MB 47.20% github.com/osrg/gobgp/server.(*BgpServer).propagateUpdate 4.50MB 0.11% 98.29% 144.60MB 3.63% github.com/osrg/gobgp/table.CreateUpdateMsgFromPaths after: (pprof) top5 1259.49MB of 1284.27MB total (98.07%) Dropped 175 nodes (cum <= 6.42MB) Showing top 10 nodes out of 26 (cum >= 36.51MB) flat flat% sum% cum cum% 975.81MB 75.98% 75.98% 976.31MB 76.02% github.com/osrg/gobgp/table.(*AdjRib).Update 198.67MB 15.47% 91.45% 208.17MB 16.21% github.com/osrg/gobgp/table.createUpdateMsgFromPath 22MB 1.71% 93.16% 22MB 1.71% github.com/osrg/gobgp/packet.(*IPAddrPrefix).Serialize 20MB 1.56% 94.72% 707.19MB 55.07% github.com/osrg/gobgp/server.(*BgpServer).propagateUpdate 13.50MB 1.05% 95.77% 13.50MB 1.05% github.com/osrg/gobgp/table.NewPath Signed-off-by: ISHIDA Wataru <ishida.wataru@lab.ntt.co.jp>
Diffstat (limited to 'server')
-rw-r--r--server/peer.go6
-rw-r--r--server/server.go14
2 files changed, 14 insertions, 6 deletions
diff --git a/server/peer.go b/server/peer.go
index c4e09617..ef08a4d8 100644
--- a/server/peer.go
+++ b/server/peer.go
@@ -105,13 +105,17 @@ func (peer *Peer) getAccepted(rfList []bgp.RouteFamily) []*table.Path {
func (peer *Peer) getBestFromLocal(rfList []bgp.RouteFamily) ([]*table.Path, []*table.Path) {
pathList := []*table.Path{}
filtered := []*table.Path{}
+ options := &table.PolicyOptions{
+ Neighbor: peer.fsm.peerInfo.Address,
+ }
for _, path := range peer.localRib.GetBestPathList(peer.TableID(), rfList) {
- p := peer.policy.ApplyPolicy(peer.TableID(), table.POLICY_DIRECTION_EXPORT, filterpath(peer, path), nil)
+ p := peer.policy.ApplyPolicy(peer.TableID(), table.POLICY_DIRECTION_EXPORT, filterpath(peer, path), options)
if p == nil {
filtered = append(filtered, path)
continue
}
if !peer.isRouteServerClient() {
+ p = p.Clone(p.IsWithdraw)
p.UpdatePathAttrs(&peer.gConf, &peer.conf)
}
pathList = append(pathList, p)
diff --git a/server/server.go b/server/server.go
index 7c18f088..bdf8988a 100644
--- a/server/server.go
+++ b/server/server.go
@@ -556,7 +556,7 @@ func filterpath(peer *Peer, path *table.Path) *table.Path {
if !peer.isRouteServerClient() && isASLoop(peer, path) {
return nil
}
- return path.Clone(peer.fsm.peerInfo.Address, path.IsWithdraw)
+ return path
}
func (server *BgpServer) dropPeerAllRoutes(peer *Peer) []*SenderMsg {
@@ -765,6 +765,7 @@ func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([]
msgs := make([]*SenderMsg, 0)
rib := server.globalRib
var alteredPathList []*table.Path
+ options := &table.PolicyOptions{}
if peer != nil && peer.isRouteServerClient() {
for _, path := range pathList {
path.Filter(peer.ID(), table.POLICY_DIRECTION_IMPORT)
@@ -783,8 +784,9 @@ func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([]
continue
}
sendPathList := make([]*table.Path, 0, len(dsts))
+ options.Neighbor = targetPeer.fsm.peerInfo.Address
for _, dst := range dsts {
- path := server.policy.ApplyPolicy(targetPeer.TableID(), table.POLICY_DIRECTION_EXPORT, filterpath(targetPeer, dst.NewFeed(targetPeer.TableID())), nil)
+ path := server.policy.ApplyPolicy(targetPeer.TableID(), table.POLICY_DIRECTION_EXPORT, filterpath(targetPeer, dst.NewFeed(targetPeer.TableID())), options)
if path != nil {
sendPathList = append(sendPathList, path)
}
@@ -818,9 +820,11 @@ func (server *BgpServer) propagateUpdate(peer *Peer, pathList []*table.Path) ([]
}
pathList := make([]*table.Path, len(sendPathList))
copy(pathList, sendPathList)
+ options.Neighbor = targetPeer.fsm.peerInfo.Address
for idx, path := range pathList {
- path = server.policy.ApplyPolicy(table.GLOBAL_RIB_NAME, table.POLICY_DIRECTION_EXPORT, filterpath(targetPeer, path), nil)
+ path = server.policy.ApplyPolicy(table.GLOBAL_RIB_NAME, table.POLICY_DIRECTION_EXPORT, filterpath(targetPeer, path), options)
if path != nil {
+ path = path.Clone(path.IsWithdraw)
path.UpdatePathAttrs(&server.bgpConfig.Global, &targetPeer.conf)
}
pathList[idx] = path
@@ -1276,7 +1280,7 @@ func (server *BgpServer) handleModPathRequest(grpcReq *GrpcRequest) []*table.Pat
return nil
}()
if path != nil {
- paths = append(paths, path.Clone(path.Owner, true))
+ paths = append(paths, path.Clone(true))
} else {
err = fmt.Errorf("Can't find a specified path")
}
@@ -1818,7 +1822,7 @@ func (server *BgpServer) handleGrpc(grpcReq *GrpcRequest) []*SenderMsg {
pathList := []*table.Path{}
for _, path := range peer.adjRibIn.PathList([]bgp.RouteFamily{grpcReq.RouteFamily}, false) {
if path = server.policy.ApplyPolicy(peer.ID(), table.POLICY_DIRECTION_IN, path, nil); path != nil {
- pathList = append(pathList, path.Clone(net.ParseIP(peer.conf.Config.NeighborAddress), false))
+ pathList = append(pathList, path.Clone(false))
}
}
m, _ := server.propagateUpdate(peer, pathList)