Skip to content

Commit 8c3f916

Browse files
erthalionMolter73
andcommitted
Split user info
sinsp_threadinfo contains two fields with user and login_user information. Since those fields are of scap_userinfo type and statically allocated, they take a lot of space: scap_userinfo m_user; /* 368 2312 */ scap_userinfo m_loginuser; /* 2680 2312 */ which is 4624 bytes out of 5728 for the whole sinsp_threadinfo: /* size: 5728, cachelines: 90, members: 64 */ Most of this memory is coming from the fields name (MAX_CREDENTIALS_STR_LEN), homedir and shell (both SCAP_MAX_PATH_SIZE). For a process-heavy workload this can mean a lot of memory taken for these purposes. To make memory management more flexible, split m_user/m_loginuser into two set of fields: * one containing uid/gid, which are ubiquitous and generally used everywhere * one for the rest of heavy details, which are needed less often The new user_details structure is not supposed to use separately from sinsp_threadinfo, thus it's defined inside the class. Co-authored-by: Mauro Ezequiel Moltrasio <[email protected]>
1 parent fecec54 commit 8c3f916

File tree

6 files changed

+119
-51
lines changed

6 files changed

+119
-51
lines changed

userspace/libsinsp/filterchecks.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6177,22 +6177,22 @@ uint8_t* sinsp_filter_check_user::extract(sinsp_evt *evt, OUT uint32_t* len, boo
61776177
switch(m_field_id)
61786178
{
61796179
case TYPE_UID:
6180-
RETURN_EXTRACT_VAR(tinfo->m_user.uid);
6180+
RETURN_EXTRACT_VAR(tinfo->m_user->uid);
61816181
case TYPE_NAME:
6182-
RETURN_EXTRACT_CSTR(tinfo->m_user.name);
6182+
RETURN_EXTRACT_STRING(tinfo->m_user->name);
61836183
case TYPE_HOMEDIR:
6184-
RETURN_EXTRACT_CSTR(tinfo->m_user.homedir);
6184+
RETURN_EXTRACT_STRING(tinfo->m_user->homedir);
61856185
case TYPE_SHELL:
6186-
RETURN_EXTRACT_CSTR(tinfo->m_user.shell);
6186+
RETURN_EXTRACT_STRING(tinfo->m_user->shell);
61876187
case TYPE_LOGINUID:
61886188
m_s64val = (int64_t)-1;
6189-
if(tinfo->m_loginuser.uid < UINT32_MAX)
6189+
if(tinfo->m_loginuser->uid < UINT32_MAX)
61906190
{
6191-
m_s64val = (int64_t)tinfo->m_loginuser.uid;
6191+
m_s64val = (int64_t)tinfo->m_loginuser->uid;
61926192
}
61936193
RETURN_EXTRACT_VAR(m_s64val);
61946194
case TYPE_LOGINNAME:
6195-
RETURN_EXTRACT_CSTR(tinfo->m_loginuser.name);
6195+
RETURN_EXTRACT_STRING(tinfo->m_loginuser->name);
61966196
default:
61976197
ASSERT(false);
61986198
break;
@@ -6237,9 +6237,9 @@ uint8_t* sinsp_filter_check_group::extract(sinsp_evt *evt, OUT uint32_t* len, bo
62376237
switch(m_field_id)
62386238
{
62396239
case TYPE_GID:
6240-
RETURN_EXTRACT_VAR(tinfo->m_group.gid);
6240+
RETURN_EXTRACT_VAR(tinfo->m_group->gid);
62416241
case TYPE_NAME:
6242-
RETURN_EXTRACT_CSTR(tinfo->m_group.name);
6242+
RETURN_EXTRACT_STRING(tinfo->m_group->name);
62436243
default:
62446244
ASSERT(false);
62456245
break;

userspace/libsinsp/parsers.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1611,9 +1611,9 @@ void sinsp_parser::parse_clone_exit_caller(sinsp_evt *evt, int64_t child_tid)
16111611
/* Refresh user / loginuser / group */
16121612
if(child_tinfo->m_container_id.empty() == false)
16131613
{
1614-
child_tinfo->set_user(child_tinfo->m_user.uid);
1615-
child_tinfo->set_loginuser(child_tinfo->m_loginuser.uid);
1616-
child_tinfo->set_group(child_tinfo->m_group.gid);
1614+
child_tinfo->set_user(child_tinfo->m_user->uid);
1615+
child_tinfo->set_loginuser(child_tinfo->m_loginuser->uid);
1616+
child_tinfo->set_group(child_tinfo->m_group->gid);
16171617
}
16181618

16191619
/* If there's a listener, invoke it */
@@ -2159,9 +2159,9 @@ void sinsp_parser::parse_clone_exit_child(sinsp_evt *evt)
21592159
/* Refresh user / loginuser / group */
21602160
if(child_tinfo->m_container_id.empty() == false)
21612161
{
2162-
child_tinfo->set_user(child_tinfo->m_user.uid);
2163-
child_tinfo->set_loginuser(child_tinfo->m_loginuser.uid);
2164-
child_tinfo->set_group(child_tinfo->m_group.gid);
2162+
child_tinfo->set_user(child_tinfo->m_user->uid);
2163+
child_tinfo->set_loginuser(child_tinfo->m_loginuser->uid);
2164+
child_tinfo->set_group(child_tinfo->m_group->gid);
21652165
}
21662166

21672167
//
@@ -2705,7 +2705,7 @@ void sinsp_parser::parse_execve_exit(sinsp_evt *evt)
27052705
if(evt->get_num_params() > 26)
27062706
{
27072707
parinfo = evt->get_param(26);
2708-
evt->m_tinfo->m_user.uid = *(uint32_t *)parinfo->m_val;
2708+
evt->m_tinfo->m_user->uid = *(uint32_t *)parinfo->m_val;
27092709
}
27102710

27112711
//
@@ -2747,9 +2747,9 @@ void sinsp_parser::parse_execve_exit(sinsp_evt *evt)
27472747
//
27482748
if(container_id != evt->m_tinfo->m_container_id)
27492749
{
2750-
evt->m_tinfo->set_user(evt->m_tinfo->m_user.uid);
2751-
evt->m_tinfo->set_loginuser(evt->m_tinfo->m_loginuser.uid);
2752-
evt->m_tinfo->set_group(evt->m_tinfo->m_group.gid);
2750+
evt->m_tinfo->set_user(evt->m_tinfo->m_user->uid);
2751+
evt->m_tinfo->set_loginuser(evt->m_tinfo->m_loginuser->uid);
2752+
evt->m_tinfo->set_group(evt->m_tinfo->m_group->gid);
27532753
}
27542754

27552755
//
@@ -6388,9 +6388,9 @@ void sinsp_parser::parse_chroot_exit(sinsp_evt *evt)
63886388
//
63896389
if(container_id != evt->m_tinfo->m_container_id)
63906390
{
6391-
evt->m_tinfo->set_user(evt->m_tinfo->m_user.uid);
6392-
evt->m_tinfo->set_loginuser(evt->m_tinfo->m_loginuser.uid);
6393-
evt->m_tinfo->set_group(evt->m_tinfo->m_group.gid);
6391+
evt->m_tinfo->set_user(evt->m_tinfo->m_user->uid);
6392+
evt->m_tinfo->set_loginuser(evt->m_tinfo->m_loginuser->uid);
6393+
evt->m_tinfo->set_group(evt->m_tinfo->m_group->gid);
63946394
}
63956395
}
63966396
}

userspace/libsinsp/sinsp.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ sinsp::sinsp(bool static_container, const std::string &static_id, const std::str
115115
m_isfatfile_enabled = false;
116116
m_isinternal_events_enabled = false;
117117
m_hostname_and_port_resolution_enabled = false;
118+
m_user_details_enabled = true;
118119
m_output_time_flag = 'h';
119120
m_max_evt_output_len = 0;
120121
m_filesize = -1;
@@ -2145,6 +2146,11 @@ void sinsp::set_hostname_and_port_resolution_mode(bool enable)
21452146
m_hostname_and_port_resolution_enabled = enable;
21462147
}
21472148

2149+
void sinsp::set_user_details(bool enable)
2150+
{
2151+
m_user_details_enabled = enable;
2152+
}
2153+
21482154
void sinsp::set_max_evt_output_len(uint32_t len)
21492155
{
21502156
m_max_evt_output_len = len;

userspace/libsinsp/sinsp.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,18 @@ class SINSP_PUBLIC sinsp : public capture_stats_source
762762
*/
763763
void set_hostname_and_port_resolution_mode(bool enable);
764764

765+
/*!
766+
\brief Set whether to store user details.
767+
768+
\note By default thread information is enriched with the full set of user
769+
information, i.e. name, homedir, shell, group name. The parameter
770+
controls this behavior, an can be used to reduce memory footprint.
771+
772+
\param enable If set to false, no extended user information will be
773+
stored in sinsp_threadinfo, only user id/group id will be available.
774+
*/
775+
void set_user_details(bool enable);
776+
765777
/*!
766778
\brief Set the runtime flag for resolving the timespan in a human
767779
readable mode.
@@ -1116,6 +1128,7 @@ VISIBILITY_PRIVATE
11161128
bool m_isfatfile_enabled;
11171129
bool m_isinternal_events_enabled;
11181130
bool m_hostname_and_port_resolution_enabled;
1131+
bool m_user_details_enabled;
11191132
char m_output_time_flag;
11201133
uint32_t m_max_evt_output_len;
11211134
bool m_compress;

userspace/libsinsp/threadinfo.cpp

Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,9 @@ void sinsp_threadinfo::init()
155155
m_exe_ino_ctime_duration_clone_ts = 0;
156156
m_exe_ino_ctime_duration_pidns_start = 0;
157157

158-
memset(&m_user, 0, sizeof(scap_userinfo));
159-
memset(&m_group, 0, sizeof(scap_groupinfo));
160-
memset(&m_loginuser, 0, sizeof(scap_userinfo));
158+
m_user = std::make_shared<sinsp_userinfo>();
159+
m_loginuser = std::make_shared<sinsp_userinfo>();
160+
m_group = std::make_shared<sinsp_groupinfo>();
161161
}
162162

163163
sinsp_threadinfo::~sinsp_threadinfo()
@@ -574,19 +574,32 @@ void sinsp_threadinfo::set_user(uint32_t uid)
574574
if (!user)
575575
{
576576
auto notify = m_inspector->is_live() || m_inspector->is_syscall_plugin();
577-
user = m_inspector->m_usergroup_manager.add_user(m_container_id, m_pid, uid, m_group.gid, NULL, NULL, NULL, notify);
577+
user = m_inspector->m_usergroup_manager.add_user(m_container_id, m_pid, uid, m_group->gid, NULL, NULL, NULL, notify);
578578
}
579+
579580
if (user)
580581
{
581-
memcpy(&m_user, user, sizeof(scap_userinfo));
582+
m_user->uid = user->uid;
583+
m_user->gid = m_group->gid;
584+
585+
if (m_inspector->m_user_details_enabled)
586+
{
587+
m_user->name.assign(user->name, sizeof(user->name));
588+
m_user->homedir.assign(user->homedir, sizeof(user->homedir));
589+
m_user->shell.assign(user->shell, sizeof(user->shell));
590+
}
582591
}
583592
else
584593
{
585-
m_user.uid = uid;
586-
m_user.gid = m_group.gid;
587-
strlcpy(m_user.name, (uid == 0) ? "root" : "<NA>", sizeof(m_user.name));
588-
strlcpy(m_user.homedir, (uid == 0) ? "/root" : "<NA>", sizeof(m_user.homedir));
589-
strlcpy(m_user.shell, "<NA>", sizeof(m_user.shell));
594+
m_user->uid = uid;
595+
m_user->gid = m_group->gid;
596+
597+
if (m_inspector->m_user_details_enabled)
598+
{
599+
m_user->name = (uid == 0) ? "root" : "<NA>";
600+
m_user->homedir = (uid == 0) ? "/root" : "<NA>";
601+
m_user->shell = "<NA>";
602+
}
590603
}
591604
}
592605

@@ -600,30 +613,51 @@ void sinsp_threadinfo::set_group(uint32_t gid)
600613
}
601614
if (group)
602615
{
603-
memcpy(&m_group, group, sizeof(scap_groupinfo));
616+
m_group->gid = group->gid;
617+
618+
if (m_inspector->m_user_details_enabled)
619+
{
620+
m_group->name.assign(group->name, sizeof(group->name));
621+
}
604622
}
605623
else
606624
{
607-
m_group.gid = gid;
608-
strlcpy(m_group.name, (gid == 0) ? "root" : "<NA>", sizeof(m_group.name));
625+
m_group->gid = gid;
626+
if (m_inspector->m_user_details_enabled)
627+
{
628+
m_group->name = (gid == 0) ? "root" : "<NA>";
629+
}
609630
}
610-
m_user.gid = m_group.gid;
631+
m_user->gid = m_group->gid;
611632
}
612633

613634
void sinsp_threadinfo::set_loginuser(uint32_t loginuid)
614635
{
615636
scap_userinfo *login_user = m_inspector->m_usergroup_manager.get_user(m_container_id, loginuid);
637+
616638
if (login_user)
617639
{
618-
memcpy(&m_loginuser, login_user, sizeof(scap_userinfo));
640+
m_loginuser->uid = login_user->uid;
641+
m_loginuser->gid = m_group->gid;
642+
643+
if (m_inspector->m_user_details_enabled)
644+
{
645+
m_loginuser->name.assign(login_user->name, sizeof(login_user->name));
646+
m_loginuser->homedir.assign(login_user->homedir, sizeof(login_user->homedir));
647+
m_loginuser->shell.assign(login_user->shell, sizeof(login_user->shell));
648+
}
619649
}
620650
else
621651
{
622-
m_loginuser.uid = loginuid;
623-
m_loginuser.gid = m_group.gid;
624-
strlcpy(m_loginuser.name, loginuid == 0 ? "root" : "<NA>", sizeof(m_loginuser.name));
625-
strlcpy(m_loginuser.homedir, loginuid == 0 ? "/root" : "<NA>", sizeof(m_loginuser.homedir));
626-
strlcpy(m_loginuser.shell, "<NA>", sizeof(m_loginuser.shell));
652+
m_loginuser->uid = loginuid;
653+
m_loginuser->gid = m_group->gid;
654+
655+
if (m_inspector->m_user_details_enabled)
656+
{
657+
m_loginuser->name = loginuid == 0 ? "root" : "<NA>";
658+
m_loginuser->homedir = loginuid == 0 ? "/root" : "<NA>";
659+
m_loginuser->shell = "<NA>";
660+
}
627661
}
628662
}
629663

@@ -1945,8 +1979,8 @@ void sinsp_thread_manager::thread_to_scap(sinsp_threadinfo& tinfo, scap_threadi
19451979

19461980
sctinfo->flags = tinfo.m_flags ;
19471981
sctinfo->fdlimit = tinfo.m_fdlimit;
1948-
sctinfo->uid = tinfo.m_user.uid;
1949-
sctinfo->gid = tinfo.m_group.gid;
1982+
sctinfo->uid = tinfo.m_user->uid;
1983+
sctinfo->gid = tinfo.m_group->gid;
19501984
sctinfo->vmsize_kb = tinfo.m_vmsize_kb;
19511985
sctinfo->vmrss_kb = tinfo.m_vmrss_kb;
19521986
sctinfo->vmswap_kb = tinfo.m_vmswap_kb;
@@ -1955,7 +1989,7 @@ void sinsp_thread_manager::thread_to_scap(sinsp_threadinfo& tinfo, scap_threadi
19551989
sctinfo->vtid = tinfo.m_vtid;
19561990
sctinfo->vpid = tinfo.m_vpid;
19571991
sctinfo->fdlist = NULL;
1958-
sctinfo->loginuid = tinfo.m_loginuser.uid;
1992+
sctinfo->loginuid = tinfo.m_loginuser->uid;
19591993
sctinfo->filtered_out = false;
19601994
}
19611995

@@ -2181,9 +2215,9 @@ threadinfo_map_t::ptr_t sinsp_thread_manager::get_thread_ref(int64_t tid, bool q
21812215
newti->m_not_expired_children = 0;
21822216
newti->m_comm = "<NA>";
21832217
newti->m_exe = "<NA>";
2184-
newti->m_user.uid = 0xffffffff;
2185-
newti->m_group.gid = 0xffffffff;
2186-
newti->m_loginuser.uid = 0xffffffff;
2218+
newti->m_user->uid = 0xffffffff;
2219+
newti->m_group->gid = 0xffffffff;
2220+
newti->m_loginuser->uid = 0xffffffff;
21872221
}
21882222

21892223
//

userspace/libsinsp/threadinfo.h

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,21 @@ class SINSP_PUBLIC sinsp_threadinfo: public libsinsp::state::table_entry
7272
{
7373

7474
public:
75+
typedef struct sinsp_userinfo
76+
{
77+
uint32_t uid; ///< User ID
78+
uint32_t gid; ///< Group ID
79+
std::string name; ///< Username
80+
std::string homedir; ///< Home directory
81+
std::string shell; ///< Shell program
82+
} sinsp_userinfo;
83+
84+
typedef struct sinsp_groupinfo
85+
{
86+
uint32_t gid; ///< Group ID
87+
std::string name; ///< Group name
88+
} sinsp_groupinfo;
89+
7590
sinsp_threadinfo(
7691
sinsp *inspector = nullptr,
7792
std::shared_ptr<libsinsp::state::dynamic_struct::field_infos> dyn_fields = nullptr);
@@ -419,9 +434,9 @@ class SINSP_PUBLIC sinsp_threadinfo: public libsinsp::state::table_entry
419434
std::string m_container_id; ///< heuristic-based container id
420435
uint32_t m_flags; ///< The thread flags. See the PPM_CL_* declarations in ppm_events_public.h.
421436
int64_t m_fdlimit; ///< The maximum number of FDs this thread can open
422-
scap_userinfo m_user; ///< user infos
423-
scap_userinfo m_loginuser; ///< loginuser infos (auid)
424-
scap_groupinfo m_group; ///< group infos
437+
std::shared_ptr<sinsp_userinfo> m_user; ///< user infos
438+
std::shared_ptr<sinsp_userinfo> m_loginuser; ///< loginuser infos (auid)
439+
std::shared_ptr<sinsp_groupinfo> m_group; ///< group infos
425440
uint64_t m_cap_permitted; ///< permitted capabilities
426441
uint64_t m_cap_effective; ///< effective capabilities
427442
uint64_t m_cap_inheritable; ///< inheritable capabilities

0 commit comments

Comments
 (0)