Skip to content

Commit 8434fff

Browse files
authored
perf: netfilter high cpu loading (#12)
* perf: netfilter high cpu loading * support centos8 4.18.0 btf
1 parent 34d354d commit 8434fff

File tree

6 files changed

+33
-24
lines changed

6 files changed

+33
-24
lines changed

ebpf/plugins/netfilter/main.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,11 @@ static __always_inline bool fill_event_info(struct event_t *event, struct sk_buf
5555
SEC("kprobe/nf_nat_setup_info")
5656
int kprobe_nf_nat_setup_info(struct pt_regs *ctx) {
5757
u64 pid_tgid;
58-
struct nf_conn *conn = (struct nf_conn *)PT_REGS_PARM1(ctx);
5958
pid_tgid = bpf_get_current_pid_tgid();
59+
if (pid_tgid == 0) {
60+
return 0;
61+
}
62+
struct nf_conn *conn = (struct nf_conn *)PT_REGS_PARM1(ctx);
6063
struct nf_conn_info_t args = {
6164
.conn_ptr = (u64)conn,
6265
};
@@ -68,6 +71,9 @@ SEC("kretprobe/nf_nat_setup_info")
6871
int kretprobe_nf_nat_setup_info(uint ret) {
6972
u64 pid_tgid;
7073
pid_tgid = bpf_get_current_pid_tgid();
74+
if (pid_tgid == 0) {
75+
return 0;
76+
}
7177
struct nf_conn_info_t *args = bpf_map_lookup_elem(&conn_maps, &pid_tgid);
7278
if (args == NULL) {
7379
return 0;
42 MB
Binary file not shown.

pkg/btfs/btfs.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ var (
2323
"5.4.278-1.el7.elrepo.x86_64": "5.4.28-200.el7.x86_64.btf",
2424
"5.5.5-1.el7.elrepo.x86_64": "5.4.28-200.el7.x86_64.btf",
2525
"4.18.0-147.5.1.el8_1.x86_64": "4.18.0-147.5.1.el8_1.x86_64.btf",
26+
"4.18.0-147.8.1.el8_1.x86_64": "4.18.0-147.8.1.el8_1.x86_64.btf",
2627
}
2728
)
2829

pkg/plugins/netfilter/ebpf/bpf_netfilter.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func RunEbpf() *NetfilterObjects {
1717
var bpfObj NetfilterObjects
1818
if err := spec.LoadAndAssign(&bpfObj, &ebpf.CollectionOptions{
1919
Programs: ebpf.ProgramOptions{
20-
LogSize: ebpf.DefaultVerifierLogSize * 10,
20+
LogSize: ebpf.DefaultVerifierLogSize,
2121
KernelTypes: btfs.BtfSpec,
2222
},
2323
}); err != nil {
@@ -59,8 +59,8 @@ type netfilterSpecs struct {
5959
}
6060

6161
type netfilterProgramSpecs struct {
62-
K_iptDoTable *ebpf.ProgramSpec `ebpf:"kprobe_ipt_do_table"`
63-
KrIptDoTable *ebpf.ProgramSpec `ebpf:"kretprobe_ipt_do_table"`
62+
//K_iptDoTable *ebpf.ProgramSpec `ebpf:"kprobe_ipt_do_table"`
63+
//KrIptDoTable *ebpf.ProgramSpec `ebpf:"kretprobe_ipt_do_table"`
6464
//K_ipForward *ebpf.ProgramSpec `ebpf:"kprobe_ip_forward"`
6565
//Kr_ipForward *ebpf.ProgramSpec `ebpf:"kretprobe_ip_forward"`
6666
K_natSetUpInfo *ebpf.ProgramSpec `ebpf:"kprobe_nf_nat_setup_info"`
@@ -69,10 +69,10 @@ type netfilterProgramSpecs struct {
6969

7070
type netfilterMapSpecs struct {
7171
EventBuf *ebpf.MapSpec `ebpf:"event_buf"`
72-
IptMaps *ebpf.MapSpec `ebpf:"ipt_maps"`
72+
//IptMaps *ebpf.MapSpec `ebpf:"ipt_maps"`
7373
//IpRcvMaps *ebpf.MapSpec `ebpf:"ip_rcv_maps"`
74-
NfConnMaps *ebpf.MapSpec `ebpf:"conn_maps"`
75-
NfConnBuf *ebpf.MapSpec `ebpf:"nf_conn_maps"`
74+
//NfConnMaps *ebpf.MapSpec `ebpf:"conn_maps"`
75+
//NfConnBuf *ebpf.MapSpec `ebpf:"nf_conn_maps"`
7676
}
7777

7878
type NetfilterObjects struct {
@@ -88,26 +88,26 @@ func (o *NetfilterObjects) Close() error {
8888
}
8989

9090
type netfilterMaps struct {
91-
EventBuf *ebpf.Map `ebpf:"event_buf"`
92-
IptMaps *ebpf.Map `ebpf:"ipt_maps"`
91+
//EventBuf *ebpf.Map `ebpf:"event_buf"`
92+
//IptMaps *ebpf.Map `ebpf:"ipt_maps"`
9393
//IpRcvMaps *ebpf.Map `ebpf:"ip_rcv_maps"`
94-
NfConnMaps *ebpf.Map `ebpf:"conn_maps"`
95-
NfConnBuf *ebpf.Map `ebpf:"nf_conn_maps"`
94+
//NfConnMaps *ebpf.Map `ebpf:"conn_maps"`
95+
NfConnBuf *ebpf.Map `ebpf:"nf_conn_maps"`
9696
}
9797

9898
func (m *netfilterMaps) Close() error {
9999
return _NetfilterClose(
100-
m.EventBuf,
101-
m.IptMaps,
100+
//m.EventBuf,
101+
//m.IptMaps,
102102
//m.IpRcvMaps,
103-
m.NfConnMaps,
103+
//m.NfConnMaps,
104104
m.NfConnBuf,
105105
)
106106
}
107107

108108
type netfilterPrograms struct {
109-
K_iptDoTable *ebpf.Program `ebpf:"kprobe_ipt_do_table"`
110-
KrIptDoTable *ebpf.Program `ebpf:"kretprobe_ipt_do_table"`
109+
//K_iptDoTable *ebpf.Program `ebpf:"kprobe_ipt_do_table"`
110+
//KrIptDoTable *ebpf.Program `ebpf:"kretprobe_ipt_do_table"`
111111
//K_ipFroward *ebpf.Program `ebpf:"kprobe_ip_forward"`
112112
//Kr_ipFroward *ebpf.Program `ebpf:"kretprobe_ip_forward""`
113113
K_natSetUpInfo *ebpf.Program `ebpf:"kprobe_nf_nat_setup_info"`
@@ -116,8 +116,8 @@ type netfilterPrograms struct {
116116

117117
func (p *netfilterPrograms) Close() error {
118118
return _NetfilterClose(
119-
p.K_iptDoTable,
120-
p.KrIptDoTable,
119+
//p.K_iptDoTable,
120+
//p.KrIptDoTable,
121121
//p.K_ipFroward,
122122
//p.Kr_ipFroward,
123123
p.K_natSetUpInfo,

pkg/plugins/netfilter/netfilter.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,13 @@ func (p *provider) Gather(c chan *metric.Metric) {
5858
}
5959
defer krpNat.Close()
6060

61+
connMap := obj.NfConnBuf
62+
var (
63+
key uint64
64+
val []byte
65+
)
6166
for {
62-
var (
63-
key uint64
64-
val []byte
65-
)
66-
for obj.NfConnBuf.Iterate().Next(&key, &val) {
67+
for connMap.Iterate().Next(&key, &val) {
6768
if err := obj.NfConnBuf.Delete(key); err != nil {
6869
panic(err)
6970
}
@@ -83,6 +84,7 @@ func (p *provider) Gather(c chan *metric.Metric) {
8384
}
8485
p.natCache.Set(fmt.Sprintf("%s:%d", srcIP, event.OriSport), natInfo, time.Minute)
8586
}
87+
time.Sleep(100 * time.Millisecond)
8688
}
8789
}
8890

pkg/plugins/protocols/http/meta/provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func (p *provider) Convert(m *ebpf.Metric) *metric.Metric {
7777

7878
sourcePod, err := p.kprobeHelper.GetPodByUID(m.SourceIP)
7979
if err != nil {
80-
p.l.Errorf("failed to get pod by uid: %s, err: %v", m.SourceIP, err)
80+
p.l.Debugf("failed to get pod by uid: %s, err: %v", m.SourceIP, err)
8181
} else {
8282
// source platform metadata
8383
output.OrgName = sourcePod.Labels["DICE_ORG_NAME"]

0 commit comments

Comments
 (0)