diff --git a/cli/cmd/bash.go b/cli/cmd/bash.go index a7114bdea..3cc02f1e0 100644 --- a/cli/cmd/bash.go +++ b/cli/cmd/bash.go @@ -76,6 +76,7 @@ func bashCommandFunc(command *cobra.Command, args []string) { bc.Uid = gConf.Uid bc.Debug = gConf.Debug bc.IsHex = gConf.IsHex + bc.SetPerCpuMapSize(gConf.mapSizeKB) logger.Printf("ECAPTURE :: pid info :%d", os.Getpid()) //bc.Pid = globalFlags.Pid diff --git a/cli/cmd/global.go b/cli/cmd/global.go index eb18bd599..84f66c592 100644 --- a/cli/cmd/global.go +++ b/cli/cmd/global.go @@ -37,6 +37,7 @@ type GlobalFlags struct { Uid uint64 // UID NoSearch bool // No lib search LoggerAddr string // save file + mapSizeKB int // ebpf map size per CPU addrType uint8 // 0:stdout, 1:file, 2:tcp address string writer io.Writer @@ -68,6 +69,11 @@ func getGlobalConf(command *cobra.Command) (conf GlobalFlags, err error) { return } + conf.mapSizeKB, err = command.Flags().GetInt("map-size") + if err != nil { + return + } + conf.LoggerAddr, err = command.Flags().GetString("log-addr") if err != nil { return diff --git a/cli/cmd/gnutls.go b/cli/cmd/gnutls.go index f14d3ff4b..85eb3c0c4 100644 --- a/cli/cmd/gnutls.go +++ b/cli/cmd/gnutls.go @@ -97,6 +97,7 @@ func gnuTlsCommandFunc(command *cobra.Command, args []string) { conf.SetUid(gConf.Uid) conf.SetDebug(gConf.Debug) conf.SetHex(gConf.IsHex) + conf.SetPerCpuMapSize(gConf.mapSizeKB) err = conf.Check() diff --git a/cli/cmd/gotls.go b/cli/cmd/gotls.go index 80567f933..adb28f64e 100644 --- a/cli/cmd/gotls.go +++ b/cli/cmd/gotls.go @@ -88,6 +88,7 @@ func goTLSCommandFunc(command *cobra.Command, args []string) { conf.SetUid(gConf.Uid) conf.SetDebug(gConf.Debug) conf.SetHex(gConf.IsHex) + conf.SetPerCpuMapSize(gConf.mapSizeKB) //conf.SetNoSearch(gConf.NoSearch) err = conf.Check() diff --git a/cli/cmd/mysqld.go b/cli/cmd/mysqld.go index 6e5d5049e..b0e6f21c9 100644 --- a/cli/cmd/mysqld.go +++ b/cli/cmd/mysqld.go @@ -70,6 +70,7 @@ func mysqldCommandFunc(command *cobra.Command, args []string) { mysqldConfig.Pid = gConf.Pid mysqldConfig.Debug = gConf.Debug mysqldConfig.IsHex = gConf.IsHex + mysqldConfig.SetPerCpuMapSize(gConf.mapSizeKB) log.Printf("ECAPTURE :: pid info :%d", os.Getpid()) //bc.Pid = globalFlags.Pid diff --git a/cli/cmd/nss.go b/cli/cmd/nss.go index faff747ce..eb3c55de5 100644 --- a/cli/cmd/nss.go +++ b/cli/cmd/nss.go @@ -97,6 +97,7 @@ func nssCommandFunc(command *cobra.Command, args []string) { conf.SetUid(gConf.Uid) conf.SetDebug(gConf.Debug) conf.SetHex(gConf.IsHex) + conf.SetPerCpuMapSize(gConf.mapSizeKB) err = conf.Check() diff --git a/cli/cmd/postgres.go b/cli/cmd/postgres.go index b5ac8ba85..453cca5b0 100644 --- a/cli/cmd/postgres.go +++ b/cli/cmd/postgres.go @@ -66,7 +66,7 @@ func postgresCommandFunc(command *cobra.Command, args []string) { postgresConfig.Pid = gConf.Pid postgresConfig.Debug = gConf.Debug postgresConfig.IsHex = gConf.IsHex - + postgresConfig.SetPerCpuMapSize(gConf.mapSizeKB) log.Printf("ECAPTURE :: pid info: %d", os.Getpid()) //bc.Pid = globalFlags.Pid if e := postgresConfig.Check(); e != nil { diff --git a/cli/cmd/root.go b/cli/cmd/root.go index 6dfef3dcf..c14baee19 100644 --- a/cli/cmd/root.go +++ b/cli/cmd/root.go @@ -93,6 +93,7 @@ func init() { rootCmd.PersistentFlags().BoolVarP(&globalFlags.Debug, "debug", "d", false, "enable debug logging") rootCmd.PersistentFlags().BoolVar(&globalFlags.IsHex, "hex", false, "print byte strings as hex encoded strings") rootCmd.PersistentFlags().BoolVar(&globalFlags.NoSearch, "nosearch", false, "no lib search") + rootCmd.PersistentFlags().IntVar(&globalFlags.mapSizeKB, "map-size", 10240, "eBPF map size per CPU,for events buffer. default:10240. (KB)") rootCmd.PersistentFlags().Uint64VarP(&globalFlags.Pid, "pid", "p", defaultPid, "if pid is 0 then we target all pids") rootCmd.PersistentFlags().Uint64VarP(&globalFlags.Uid, "uid", "u", defaultUid, "if uid is 0 then we target all users") rootCmd.PersistentFlags().StringVarP(&globalFlags.LoggerAddr, "log-addr", "l", "", "-l /tmp/ecapture.log or -l tcp://127.0.0.1:8080") diff --git a/cli/cmd/tls.go b/cli/cmd/tls.go index 963743861..439ad1bd4 100644 --- a/cli/cmd/tls.go +++ b/cli/cmd/tls.go @@ -105,7 +105,7 @@ func openSSLCommandFunc(command *cobra.Command, args []string) { conf.SetUid(gConf.Uid) conf.SetDebug(gConf.Debug) conf.SetHex(gConf.IsHex) - + conf.SetPerCpuMapSize(gConf.mapSizeKB) err = conf.Check() if err != nil { diff --git a/user/config/common_androidgki.go b/user/config/common_androidgki.go index 3eebbcfc3..8cac2840f 100644 --- a/user/config/common_androidgki.go +++ b/user/config/common_androidgki.go @@ -24,6 +24,7 @@ var ( "/apex/com.android.conscrypt/lib64", "/apex/com.android.runtime/lib64/bionic", } + DefaultMapSizePerCpu = os.Getpagesize() * 512 ) const ElfArchIsandroid = true diff --git a/user/config/common_linux.go b/user/config/common_linux.go index ce98e95d3..7e1612c56 100644 --- a/user/config/common_linux.go +++ b/user/config/common_linux.go @@ -17,7 +17,10 @@ package config -import "log" +import ( + "log" + "os" +) const ( LdLoadPath = "/etc/ld.so.conf" @@ -40,6 +43,9 @@ var ( "/usr/lib64", "/lib64", } + + // default: 4MB + DefaultMapSizePerCpu = os.Getpagesize() * 1024 ) func GetDynLibDirs() []string { diff --git a/user/config/config_bash.go b/user/config/config_bash.go index 266a2d114..8e559ff69 100644 --- a/user/config/config_bash.go +++ b/user/config/config_bash.go @@ -31,6 +31,7 @@ type BashConfig struct { func NewBashConfig() *BashConfig { config := &BashConfig{} + config.PerCpuMapSize = DefaultMapSizePerCpu return config } diff --git a/user/config/config_gnutls.go b/user/config/config_gnutls.go index 5394c1f1a..c2c67161b 100644 --- a/user/config/config_gnutls.go +++ b/user/config/config_gnutls.go @@ -24,5 +24,6 @@ type GnutlsConfig struct { func NewGnutlsConfig() *GnutlsConfig { config := &GnutlsConfig{} + config.PerCpuMapSize = DefaultMapSizePerCpu return config } diff --git a/user/config/config_gotls.go b/user/config/config_gotls.go index 239e0f7bd..76b5bbdcf 100644 --- a/user/config/config_gotls.go +++ b/user/config/config_gotls.go @@ -49,7 +49,9 @@ type GoTLSConfig struct { // NewGoTLSConfig creates a new config for Go SSL func NewGoTLSConfig() *GoTLSConfig { - return &GoTLSConfig{} + gc := &GoTLSConfig{} + gc.PerCpuMapSize = DefaultMapSizePerCpu + return gc } func (gc *GoTLSConfig) Check() error { diff --git a/user/config/config_mysqld.go b/user/config/config_mysqld.go index 9e798f302..6f9c64d18 100644 --- a/user/config/config_mysqld.go +++ b/user/config/config_mysqld.go @@ -49,6 +49,7 @@ type MysqldConfig struct { func NewMysqldConfig() *MysqldConfig { config := &MysqldConfig{} + config.PerCpuMapSize = DefaultMapSizePerCpu return config } diff --git a/user/config/config_nspr.go b/user/config/config_nspr.go index 9dd6049b4..49d62e1f2 100644 --- a/user/config/config_nspr.go +++ b/user/config/config_nspr.go @@ -24,5 +24,6 @@ type NsprConfig struct { func NewNsprConfig() *NsprConfig { config := &NsprConfig{} + config.PerCpuMapSize = DefaultMapSizePerCpu return config } diff --git a/user/config/config_openssl.go b/user/config/config_openssl.go index 462238f61..443af2b0d 100644 --- a/user/config/config_openssl.go +++ b/user/config/config_openssl.go @@ -49,6 +49,7 @@ type OpensslConfig struct { func NewOpensslConfig() *OpensslConfig { config := &OpensslConfig{} + config.PerCpuMapSize = DefaultMapSizePerCpu return config } diff --git a/user/config/config_postgres.go b/user/config/config_postgres.go index f3a585ecf..636e2cb1e 100644 --- a/user/config/config_postgres.go +++ b/user/config/config_postgres.go @@ -32,6 +32,7 @@ type PostgresConfig struct { func NewPostgresConfig() *PostgresConfig { config := &PostgresConfig{} + config.PerCpuMapSize = DefaultMapSizePerCpu return config } diff --git a/user/config/iconfig.go b/user/config/iconfig.go index 7fbdbd696..54ab87e08 100644 --- a/user/config/iconfig.go +++ b/user/config/iconfig.go @@ -14,7 +14,9 @@ package config -import "ecapture/pkg/util/kernel" +import ( + "ecapture/pkg/util/kernel" +) type IConfig interface { Check() error //检测配置合法性 @@ -26,14 +28,17 @@ type IConfig interface { SetUid(uint64) SetHex(bool) SetDebug(bool) + GetPerCpuMapSize() int + SetPerCpuMapSize(int) EnableGlobalVar() bool // } type eConfig struct { - Pid uint64 - Uid uint64 - IsHex bool - Debug bool + Pid uint64 + Uid uint64 + PerCpuMapSize int // ebpf map size for per Cpu. see https://github.com/gojue/ecapture/issues/433 . + IsHex bool + Debug bool } func (c *eConfig) GetPid() uint64 { @@ -68,6 +73,14 @@ func (c *eConfig) SetHex(isHex bool) { c.IsHex = isHex } +func (c *eConfig) GetPerCpuMapSize() int { + return c.PerCpuMapSize +} + +func (c *eConfig) SetPerCpuMapSize(size int) { + c.PerCpuMapSize = size +} + func (c *eConfig) EnableGlobalVar() bool { kv, err := kernel.HostVersion() if err != nil { diff --git a/user/module/const_androidgki.go b/user/module/const_androidgki.go deleted file mode 100644 index 5da32d4fe..000000000 --- a/user/module/const_androidgki.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build androidgki -// +build androidgki - -package module - -// buffer size times of ebpf perf map -// buffer size = BufferSizeOfEbpfMap * os.pagesize -const BufferSizeOfEbpfMap = 1024 diff --git a/user/module/const_linux.go b/user/module/const_linux.go deleted file mode 100644 index 911b0db41..000000000 --- a/user/module/const_linux.go +++ /dev/null @@ -1,8 +0,0 @@ -//go:build !androidgki -// +build !androidgki - -package module - -// buffer size times of ebpf perf map -// buffer size = BufferSizeOfEbpfMap * os.pagesize -const BufferSizeOfEbpfMap = 1024 * 10 diff --git a/user/module/imodule.go b/user/module/imodule.go index e4c2236f3..05f9cae6b 100644 --- a/user/module/imodule.go +++ b/user/module/imodule.go @@ -26,7 +26,6 @@ import ( "github.com/cilium/ebpf/perf" "github.com/cilium/ebpf/ringbuf" "log" - "os" "strings" ) @@ -190,7 +189,7 @@ func (m *Module) readEvents() error { } func (m *Module) perfEventReader(errChan chan error, em *ebpf.Map) { - rd, err := perf.NewReader(em, os.Getpagesize()*BufferSizeOfEbpfMap) + rd, err := perf.NewReader(em, m.conf.GetPerCpuMapSize()) if err != nil { errChan <- fmt.Errorf("creating %s reader dns: %s", em.String(), err) return