Ethereal-dev: Re: [Ethereal-dev] Performance. Ethereal is slow when using largecaptures.
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Richard Sharpe <rsharpe@xxxxxxxxxxxxxxxxx>
Date: Sat, 15 Nov 2003 00:17:26 -0800 (PST)
On Sat, 15 Nov 2003, Newbie wrote: > Ronnie, > > I haven't done a "formal" test, per se, but I ran a couple of quick > tests out of curiosity and thought I'd share the results. > > I used a file I had sitting around - a 124,568 packet trace containing > primarily CIFS traffic. Can you send us the output of gprof? Also, what flags did you give to gcc to generate the profiling stuff? I would like to add a target to the Makefile that will allow us to build a profile-ready program. However, it might be better to add it to configure. > I ran two tests with profiling enabled: One where I simply opened the > file, then exited the program, and another where I opened the file, then > refiltered using "smb" as a display filter, then exited the program. > > Both tests gave me nearly identical results as far as the most "costly" > procedures, so I'll concentrate just on the second test. > > The function consuming the most time was epan/proto.c:compare_proto_id, > at 22.9%, 8.14s, and 777,148,074 calls (nearly more calls, I believe, > than to all other functions combined). > > add_packet_to_packet_list actually came in at #5, with 7.6%, 2.64s - > including time spend in its child functions (epan_dissect_run, mostly > (5.1%/1.8s), which in turn spent the majority of its time in > dissect_packet (5.1%, 1.71s)). > > compare_proto_id appeared to be a called by g_list_find_custom. It > accounted for an additional 5.9%/2.11s, for a total of 28.8% spent in > this particular function (when added to the time spent in its child > function, compare_proto_id) > > proto_tree_add_pi appeared to be more "expensive" (10.0%, 2.82s) than > add_packet_to_packet_list, and proto_tree_add_uint (6.7%, 2.01s). > > The test system is an Apple G5 running OS X 10.3, with GTK+ 1.2.10, > Ethereal 0.9.16 with no special GCC flags and "configure --without-plugins". > > Let me know if you want me to do a more "formal" test, and upload the > trace to some shared area (perhaps Gerald wouldn't mind setting up an > area temporarily on ftp.ethereal.com, or do we already have something > like that?). > > Ian > > > Ronnie Sahlberg wrote: > > >Good point. > >I never noticed that the number of sessions affected the refilter speed. > >The type of traffic (some reassembled PDUs take much longer than others to > >dissect) I know would affect it but never knew the number of sessions > >did. > > > >The problem now is that fore VERY large captures, ethereal is always slow > >under all circumstances. > >So let us start with just a simple random generic capture and measure for it > >to try to keep the number of variables low. > >(If it is as you say the number of sessions affect it as well, do you mean > >the number of TCP sessions or what kind of sessions? > > At some point, when the worst performance problem has been addressed this > >would be a very interesting area to look at. > > (I could create different synthetic capture files to measure with, same > >number of packets, same payload just different number of sessions) > > Make a note that you have observed the number of sessions to possibly have > >an effect on the dissection speed so we dont forget to look at > > it furhter down the track > >) > > > > > >I currently belive that during refiltering of a capture, most time would be > >spent inside file.c/add_packet_to_packet_list(). > >It would be VERY VERY useful to verify that this assumption is correct. > >I would really like someone to look at gprof data and analyze where most > >time is consumed to either verify my claim add_packet_to_packet_list() > >or to invalidate it. > > > >The thing inside this function I think consumes the most cpu I belive would > >be where we call epan_dissect_run() and perform a full dissection of the > >packet. > > > > > >As I see it, apart from the initial time we encounter the packet during file > >read (or live capture) there are not that many instances where we really > >must > >dissect the packet at all. > >OK. If we select a packet in the list so it gets displayed in the dissect > >pane that might be an exception but that is not something that we do 100.000 > >times > >per capture anyway so the performance of that is irrelevant. > >We might also need to do a full rescan/redissect of all packets IF we have > >changed the preferences in such a way that the packets will be dissected > >differently or when we have changed stuff using DecodeAs. > > > >However, for me and many other users, the MAIN reason ethereal rescans the > >packet list is because we have applied or changed a filter. Some users will > >filter and refilter a capture file over and over and over, ten, twenty, > >thirty if not more times for each capture they work with. > >Or see when a ConversationList dislog or a ServiceResponseTime dialog is > >opened. > > > > > >Well enough of that. To my idea: > > > >Hypothesis: A significant part of the slowness of ethereal when refiltering > >a capture file comes from the expensive calls to epan_dissect_run() called > >from add_packet_to_packet_list() in file.c > >Potential fix: Reduce the number of calls made to epan_dissect_run() at the > >expense of additional memory requirements (enabled by a preference) > > > >Assuming that most of the time we perform a full rescan/redissect of the > >capture file is when we really just want to reapply a display filter. (and > >are not doing anything that affects how a packet is dissected). > > > >What do we need in order to refilter the packet list if we do not allow > >calling epan_dissect_run()? > >1, We need to remember all COL values for all packets so that we can just > >reapply them when adding the packet to the packetlist without calling the > >dissector and recreating them that way. This will consume additional > >memory. > >2, For every packet we need to keep a list of all the hf_fields that were > >encountered in the packet. > > This list contains the index of the hf variable as well as the value it > >has. > > Nothing else needs to be stored there (in order to reduce the impact on > >memory) > > This list may NOT be pruned as the edt structs are. This is because we > >want to be able to still use this list even after the filters have changed > >and thus > >the pruning would be different. No pruning. > >The "ApplyFilterToEdtStructure" fucntions would need to be changed (or > >duplicated) so they could operate on the list in 2 instead of the edt > >structure. > >This function might also need to be looked at so that it would be efficient > >even for very large lists (no pruning) > > > > > >1 would allow us to rebuild the packet list without needing to call the > >dissector (?) > >2 would allow us to refilter the entire trace without calling any > >dissectors. > > > >ideas, comments? > > > > > >Right now it would be nice if someone could create a capture as I proposed > >earlier and use GPROF to check where most of the CPU is spent when > >refiltering the capture. To verify if my assumptions are correct or > >invalidate them. > > > > > >( > >As a nice benefit in the future, IF we were to have that list of fields for > >each packet, easily available, we could do things like merging this list > >between packets. > >Say #6 is the Call and #27 is the Response. > >Since these packets are paired we could merge the lists from these two > >packets into a single one. > >Then when searcing for something that occured in the Response packet, we > >would automatically also pick up the matching Call packet sinte their lists > >were merged. > >I.e filtering for smb.error==foo would both find the Response that barfed > >saying foo but also teh matched Call to this Response. > >That would also be useful. > >) > > > > > > _______________________________________________ > Ethereal-dev mailing list > Ethereal-dev@xxxxxxxxxxxx > http://www.ethereal.com/mailman/listinfo/ethereal-dev > -- Regards ----- Richard Sharpe, rsharpe[at]ns.aus.com, rsharpe[at]samba.org, sharpe[at]ethereal.com, http://www.richardsharpe.com
- References:
- Prev by Date: Re: [Ethereal-dev] Performance. Ethereal is slow whenusing largecaptures.
- Next by Date: [Ethereal-dev] Profile data for Ethereal on one large 130MB capture file
- Previous by thread: Re: [Ethereal-dev] Performance. Ethereal is slow whenusing largecaptures.
- Next by thread: Re: [Ethereal-dev] Performance. Ethereal is slow when using largecaptures.
- Index(es):