x/net/spdy: processing of 35 bytes takes 7 seconds
dvyukov opened this issue · 2 comments
dvyukov commented
The following program runs for 7+ seconds. This is too much to process 35 bytes of input.
package main
import (
"bytes"
"encoding/hex"
"golang.org/x/net/spdy"
"io/ioutil"
)
func main() {
data, _ := hex.DecodeString("80300002303030303030303078f9e3c6a7c24230104e04e57c08af090600000000ffff")
framer, err := spdy.NewFramer(ioutil.Discard, bytes.NewReader(data))
if err != nil {
panic(err)
}
for score := 0; ; score++ {
f, err := framer.ReadFrame()
if err != nil {
if f != nil {
panic(err)
}
return
}
err = framer.WriteFrame(f)
if err != nil {
panic(err)
}
}
}
on commit 6f62f426de90c0ed6a55207b51476115fcb17237
dvyukov commented
The profile looks like:
90.12% spdy spdy [.] runtime.heapBitsSetType
6.76% spdy [kernel.kallsyms] [k] clear_page_c
1.85% spdy spdy [.] runtime.memclr
iyangsj commented
The number of headers in SYN_REPLY frame is 740961381 !
As a result, it takes more than 7 seconds to create such a map with size 740961381.