ergochat / ergo

A modern IRC server (daemon/ircd) written in Go.
https://ergo.chat/
MIT License
2.27k stars 180 forks source link

investigate reducing binary size #590

Open slingamn opened 5 years ago

slingamn commented 5 years ago

https://github.com/jondot/goweight says:

$ goweight github.com/oragono/oragono
  3.8 MB net/http
  3.3 MB runtime
  3.1 MB github.com/oragono/oragono/irc
  1.8 MB net
  1.8 MB crypto/tls
  1.5 MB github.com/oragono/oragono/vendor/golang.org/x/sys/unix
  1.3 MB reflect
  1.1 MB github.com/oragono/oragono/vendor/gopkg.in/yaml.v2
  940 kB math/big
  799 kB syscall
  740 kB crypto/x509
  671 kB text/template
  631 kB encoding/json
  568 kB text/template/parse
  551 kB html/template
  476 kB github.com/oragono/oragono/vendor/golang.org/x/text/unicode/norm
  469 kB internal/x/text/unicode/norm
  452 kB time
  437 kB github.com/oragono/oragono/vendor/golang.org/x/text/internal/language
  436 kB fmt
  423 kB regexp/syntax
  412 kB internal/x/net/dns/dnsmessage
  404 kB os
  399 kB github.com/oragono/oragono/vendor/golang.org/x/text/language
  396 kB regexp
  372 kB github.com/oragono/oragono/vendor/github.com/docopt/docopt-go
  359 kB github.com/oragono/oragono/vendor/github.com/tidwall/buntdb
  346 kB compress/flate
  341 kB runtime/pprof
  320 kB crypto/elliptic
  304 kB github.com/oragono/oragono/vendor/github.com/oragono/confusables
  302 kB encoding/asn1
  297 kB github.com/oragono/oragono/vendor/golang.org/x/text/cases
  279 kB internal/x/crypto/cryptobyte
  266 kB strings
  265 kB github.com/oragono/oragono/vendor/github.com/tidwall/gjson
  263 kB strconv
  252 kB github.com/oragono/oragono/vendor/golang.org/x/text/unicode/bidi
  249 kB internal/x/text/unicode/bidi
  229 kB unicode
  224 kB internal/poll
  223 kB math
  220 kB github.com/oragono/oragono/vendor/golang.org/x/text/secure/precis
  210 kB internal/x/net/idna
  207 kB mime
  199 kB bytes
  186 kB crypto/rsa
  182 kB html
  179 kB internal/x/net/http2/hpack
  178 kB encoding/binary
  177 kB bufio
  173 kB mime/multipart
  169 kB net/url
  166 kB net/textproto
  161 kB github.com/oragono/oragono/vendor/golang.org/x/text/internal/language/compact
  160 kB github.com/oragono/oragono/vendor/github.com/tidwall/btree
  155 kB github.com/oragono/oragono/vendor/github.com/tidwall/rtree/base
  142 kB net/smtp
  141 kB crypto/cipher
  140 kB io
  135 kB github.com/oragono/oragono/vendor/golang.org/x/crypto/ssh/terminal
  130 kB github.com/oragono/oragono/vendor/golang.org/x/text/width
  124 kB sync
  121 kB sort
  116 kB runtime/cgo
  112 kB github.com/oragono/oragono/irc/utils
  112 kB math/rand
  111 kB github.com/oragono/oragono/vendor/golang.org/x/text/runes
  107 kB github.com/oragono/oragono/vendor/golang.org/x/crypto/sha3
  104 kB crypto/ecdsa
  104 kB crypto/aes
  102 kB net/http/pprof
  102 kB github.com/oragono/oragono/vendor/golang.org/x/text/transform
  102 kB internal/x/text/transform
  101 kB path/filepath
   98 kB context
   97 kB internal/x/crypto/chacha20poly1305
   80 kB github.com/oragono/oragono/vendor/github.com/mgutz/ansi
   79 kB crypto/sha512
   77 kB encoding/base64
   77 kB github.com/oragono/oragono/irc/logger
   77 kB github.com/oragono/oragono/vendor/github.com/goshuirc/irc-go/ircmsg
   75 kB github.com/oragono/oragono/irc/history
   75 kB compress/gzip
   74 kB crypto/x509/pkix
   74 kB internal/x/net/http/httpproxy
   71 kB crypto/sha256
   69 kB io/ioutil
   69 kB crypto/sha1
   69 kB github.com/oragono/oragono/vendor/github.com/tidwall/pretty
   68 kB github.com/oragono/oragono/irc/connection_limits
   67 kB github.com/oragono/oragono/irc/languages
   65 kB crypto/rand
   65 kB github.com/oragono/oragono/vendor/github.com/tidwall/rtree
   65 kB github.com/oragono/oragono/irc/modes
   64 kB net/http/internal
   63 kB encoding/base32
   61 kB github.com/oragono/oragono/vendor/golang.org/x/crypto/bcrypt
   60 kB github.com/oragono/oragono/vendor/github.com/goshuirc/irc-go/ircfmt
   60 kB text/tabwriter
   60 kB net/http/httptrace
   58 kB hash/crc32
   57 kB encoding/pem
   57 kB container/list
   56 kB log
   56 kB github.com/oragono/oragono/vendor/github.com/goshuirc/e-nfa
   55 kB github.com/oragono/oragono/irc/caps
   52 kB internal/fmtsort
   52 kB crypto/des
   49 kB mime/quotedprintable
   48 kB crypto/md5
   48 kB encoding/hex
   46 kB crypto/dsa
   44 kB github.com/oragono/oragono/vendor/github.com/tidwall/grect
   42 kB os/signal
   42 kB internal/x/crypto/internal/chacha20
   41 kB github.com/oragono/oragono/irc/isupport
   41 kB github.com/oragono/oragono/vendor/golang.org/x/text/secure/bidirule
   40 kB internal/cpu
   40 kB github.com/oragono/oragono/vendor/golang.org/x/text/internal
   39 kB runtime/debug
   39 kB internal/x/text/secure/bidirule
   39 kB github.com/oragono/oragono/vendor/golang.org/x/crypto/blowfish
   39 kB math/bits
   34 kB path
   33 kB github.com/oragono/oragono/vendor/github.com/oragono/go-ident
   31 kB internal/x/crypto/curve25519
   31 kB runtime/trace
   30 kB github.com/oragono/oragono/irc/mkcerts
   30 kB internal/x/net/http/httpguts
   27 kB unicode/utf8
   26 kB internal/singleflight
   26 kB crypto
   23 kB github.com/oragono/oragono/irc/custime
   22 kB github.com/oragono/oragono/vendor/github.com/mattn/go-colorable
   19 kB sync/atomic
   18 kB internal/x/crypto/poly1305
   17 kB github.com/oragono/oragono/vendor/golang.org/x/text/internal/tag
   17 kB github.com/oragono/oragono/vendor/github.com/tidwall/tinyqueue
   17 kB crypto/rc4
   16 kB github.com/oragono/oragono/vendor/github.com/tidwall/match
   15 kB github.com/oragono/oragono/irc/cloaks
   15 kB hash
   15 kB internal/bytealg
   14 kB internal/syscall/unix
   14 kB crypto/hmac
   14 kB internal/testlog
   14 kB internal/x/crypto/hkdf
   13 kB github.com/oragono/oragono/vendor/github.com/goshuirc/irc-go/ircmatch
   13 kB github.com/oragono/oragono/vendor/code.cloudfoundry.org/bytefmt
   12 kB runtime/internal/atomic
   11 kB runtime/internal/sys
   10 kB github.com/oragono/oragono/irc/sno
  8.0 kB unicode/utf16
  7.7 kB crypto/internal/randutil
  6.8 kB encoding
  6.2 kB crypto/subtle
  6.0 kB internal/x/crypto/cryptobyte/asn1
  5.7 kB github.com/oragono/oragono/irc/passwd
  4.2 kB errors
  4.2 kB internal/nettrace
  3.6 kB internal/race
  3.5 kB github.com/oragono/oragono/vendor/github.com/mattn/go-isatty
  3.1 kB crypto/internal/subtle
  1.6 kB runtime/internal/math
slingamn commented 5 years ago

Some of these numbers check out and some of them are misleading. For example, a current stripped (no debug symbols, via -ldflags="-s -w") build for linux/amd64 is 10.5 MB. Stripping out the pprof listener (which removes net/http and friends) immediately took it down to 7.3 MB. However, removing golang.org/x/sys/unix and all its reverse dependencies produced only a marginal improvement beyond that. There doesn't seem to be any more low-hanging fruit after that (yaml and its dependency reflect are the biggest line items, but they're unremovable).

Anyway, this is useful information in case anyone comes to us wanting to run oragono in a very low-end environment: removing the pprof listener will save about 3 MB in binary size.

slingamn commented 4 years ago

Removing runtime/pprof entirely (including its associated /DEBUG subcommands) saves some additional space here.

slingamn commented 4 years ago

Now that we have the ASCII folding mode, PRECIS can be compiled out for a savings of about a megabyte (before stripping).