----- Original Message ----- > Hi all, > > I came across pahole <http://linux.die.net/man/1/pahole>, and it's > able to show some pretty interesting info about ATS internal > structures. It looks like there's probably some opportunities to > pack structure better, and probably improve cache utilization. > > For example, HttpSM could be 54 bytes smaller:
Awesome! And, as always, I'm here to ask the uncomfortable questions so no one else has to: How is that going to fare with ABI compatibility? How does this compare between 32bit and 64bit? How does it compare between different platforms? > ~/trafficserver.git$ pahole -C HttpSM ./proxy/.libs/traffic_server > die__process_function: tag not supported (template_type_parameter)! > die__process_class: tag not supported (template_value_parameter)! > struct HttpSM : public Continuation { > struct History { > const char * fileline; /* 0 8 > */ > short unsigned int event; /* 8 2 > */ > short int reentrancy; /* 10 2 > */ > > /* size: 16, cachelines: 1, members: 3 */ > /* last cacheline: 16 bytes */ > > /* BRAIN FART ALERT! 16 != 12 + 0(holes), diff = 4 */ > > }; > > class Link_debug_link : public Link<HttpSM> { > public: > > /* struct Link<HttpSM> <ancestor>; */ /* 0 16 > */ > class HttpSM * & next_link(class HttpSM *); /* > linkage=_ZN6HttpSM15Link_debug_link9next_linkEPS_ */ > > class HttpSM * & prev_link(class HttpSM *); /* > linkage=_ZN6HttpSM15Link_debug_link9prev_linkEPS_ */ > > const class HttpSM * next_link(const class HttpSM *); /* > linkage=_ZN6HttpSM15Link_debug_link9next_linkEPKS_ */ > > const class HttpSM * prev_link(const class HttpSM *); /* > linkage=_ZN6HttpSM15Link_debug_link9prev_linkEPKS_ */ > > > /* size: 16, cachelines: 1, members: 1 */ > /* last cacheline: 16 bytes */ > }; > > public: > > /* struct Continuation <ancestor>; */ /* 0 48 */ > int64_t sm_id; /* 48 8 */ > unsigned int magic; /* 56 4 */ > bool enable_redirection; /* 60 1 */ > bool api_enable_redirection; /* 61 1 */ > > /* XXX 2 bytes hole, try to pack */ > > /* --- cacheline 1 boundary (64 bytes) --- */ > char * redirect_url; /* 64 8 */ > int redirect_url_len; /* 72 4 */ > int redirection_tries; /* 76 4 */ > int64_t transfered_bytes; /* 80 8 */ > bool post_failed; /* 88 1 */ > bool debug_on; /* 89 1 */ > > /* XXX 2 bytes hole, try to pack */ > > enum HttpPluginTunnel_t plugin_tunnel_type; /* 92 4 */ > class PluginVCCore * plugin_tunnel; /* 96 8 */ > struct State t_state; /* 104 5920 */ > protected: > > /* --- cacheline 94 boundary (6016 bytes) was 8 bytes ago --- */ > int reentrancy_count; /* 6024 4 */ > > /* XXX 4 bytes hole, try to pack */ > > struct History history[64]; /* 6032 1024 */ > /* --- cacheline 110 boundary (7040 bytes) was 16 bytes ago --- */ > int history_pos; /* 7056 4 */ > > /* XXX 4 bytes hole, try to pack */ > > class HttpTunnel tunnel; /* 7064 1072 */ > /* --- cacheline 127 boundary (8128 bytes) was 8 bytes ago --- */ > struct HttpVCTable vc_table; /* 8136 288 */ > /* --- cacheline 131 boundary (8384 bytes) was 40 bytes ago --- */ > class HttpVCTableEntry * ua_entry; /* 8424 8 */ > class HttpClientSession * ua_session; /* 8432 8 */ > enum BackgroundFill_t background_fill; /* 8440 4 */ > > /* XXX 4 bytes hole, try to pack */ > > /* --- cacheline 132 boundary (8448 bytes) --- */ > class IOBufferReader * ua_buffer_reader; /* 8448 8 */ > class HttpVCTableEntry * server_entry; /* 8456 8 */ > class HttpServerSession * server_session; /* 8464 8 */ > int shared_session_retries; /* 8472 4 */ > > /* XXX 4 bytes hole, try to pack */ > > class IOBufferReader * server_buffer_reader; /* 8480 8 */ > struct HttpTransformInfo transform_info; /* 8488 16 */ > struct HttpTransformInfo post_transform_info; /* 8504 16 */ > /* --- cacheline 133 boundary (8512 bytes) was 8 bytes ago --- */ > class HttpCacheSM cache_sm; /* 8520 184 */ > /* --- cacheline 136 boundary (8704 bytes) --- */ > class HttpCacheSM transform_cache_sm; /* 8704 184 */ > /* --- cacheline 138 boundary (8832 bytes) was 56 bytes ago --- */ > class HttpCacheSM * second_cache_sm; /* 8888 8 */ > /* --- cacheline 139 boundary (8896 bytes) --- */ > HttpSMHandler default_handler; /* 8896 16 */ > class Action * pending_action; /* 8912 8 */ > class Action * historical_action; /* 8920 8 */ > class Continuation * schedule_cont; /* 8928 8 */ > struct HTTPParser http_parser; /* 8936 48 */ > /* --- cacheline 140 boundary (8960 bytes) was 24 bytes ago --- */ > enum StateMachineAction_t last_action; /* 8984 4 */ > > /* XXX 4 bytes hole, try to pack */ > > struct { > int (*__pfn)(class HttpSM *, int, void *); /* > 8992 > 8 */ > long int __delta; /* 9000 8 */ > } m_last_state; /* 8992 16 */ > int client_request_hdr_bytes; /* 9008 4 > */ > > /* XXX 4 bytes hole, try to pack */ > > int64_t client_request_body_bytes; /* 9016 8 > */ > /* --- cacheline 141 boundary (9024 bytes) --- */ > int server_request_hdr_bytes; /* 9024 4 > */ > > /* XXX 4 bytes hole, try to pack */ > > int64_t server_request_body_bytes; /* 9032 8 > */ > int server_response_hdr_bytes; /* 9040 4 > */ > > /* XXX 4 bytes hole, try to pack */ > > int64_t server_response_body_bytes; /* 9048 > 8 */ > int client_response_hdr_bytes; /* 9056 4 > */ > > /* XXX 4 bytes hole, try to pack */ > > int64_t client_response_body_bytes; /* 9064 > 8 */ > int cache_response_hdr_bytes; /* 9072 4 > */ > > /* XXX 4 bytes hole, try to pack */ > > int64_t cache_response_body_bytes; /* 9080 8 > */ > /* --- cacheline 142 boundary (9088 bytes) --- */ > int pushed_response_hdr_bytes; /* 9088 4 > */ > > /* XXX 4 bytes hole, try to pack */ > > int64_t pushed_response_body_bytes; /* 9096 > 8 */ > class TransactionMilestones milestones; /* 9104 152 */ > /* --- cacheline 144 boundary (9216 bytes) was 40 bytes ago --- */ > int hooks_set; /* 9256 4 */ > TSHttpHookID cur_hook_id; /* 9260 4 */ > class APIHook * cur_hook; /* 9264 8 */ > int64_t prev_hook_start_time; /* 9272 8 */ > /* --- cacheline 145 boundary (9280 bytes) --- */ > int cur_hooks; /* 9280 4 */ > enum HttpApiState_t callout_state; /* 9284 4 */ > class HttpAPIHooks api_hooks; /* 9288 264 */ > /* --- cacheline 149 boundary (9536 bytes) was 16 bytes ago --- */ > bool terminate_sm; /* 9552 1 */ > bool kill_this_async_done; /* 9553 1 */ > > /* XXX 6 bytes hole, try to pack */ > > struct Link<HttpSM> debug_link; /* 9560 16 */ > ... > > /* vtable has 4 entries: { > [2] = destroy(_ZN6HttpSM7destroyEv), > [3] = handle_api_return(_ZN6HttpSM17handle_api_returnEv), > [4] = set_next_state(_ZN6HttpSM14set_next_stateEv), > [5] = kill_this_async_hook(_ZN6HttpSM20kill_this_async_hookEiPv), > } */ > /* size: 9576, cachelines: 150, members: 62 */ > /* sum members: 9522, holes: 14, sum holes: 54 */ > /* last cacheline: 40 bytes */ > }; > > -- Igor Galić Tel: +43 (0) 664 886 22 883 Mail: i.ga...@brainsware.org URL: http://brainsware.org/ GPG: 6880 4155 74BD FD7C B515 2EA5 4B1D 9E08 A097 C9AE