On Wed, Aug 05, 2009 at 03:13:34PM +1000, Arjen Lentz wrote: > The issue in MySQL has been overhead of such instrumentation, > particularly also when not used. Some cause 5-20% perf loss which is > unacceptable.
110% agree. If you're not doing analysis of anything, it shouldn't cost you. You also shouldn't have to restart, rebuild or anything like that. I think I know how to do this too. I have this inkling that it's the "if(profiling_enabled)" inserted everywhere that kills us. This is pretty easy to check. Say we have some function f() that is going to do some counting for us (e.g. number of rows fetched, number of times mutex X was taken). If profiling is disabled, we want this to use 0 CPU. calling an empty function int f(int) a billion times in a loop is roughly equivilnet of just running through the loop (yes, i built with gcc -O0 and checked the produced code). By roughly I do mean next to impossible to measure. If you add a simple "if(x) something;" to the function f(), it is noticably slower! (roughly 20% in my tests). So we really don't want to do that compare. Now... about this time somebody is going to jump up and suggest using DTrace to insert code at runtime. Not on Linux, so is worse than useless here. But we can do some cool self modifying code tricks. The same do-nothing f() does not take any longer to run if we insert a few no-ops. (i tried inserting 4 NOP instructions, which are single byte... i do wonder if the multi-byte NOP instruction could help here too). So... when a profile hook is enabled, we just modify f() to call the real profiling function. This can either be done with an atomic instruction writing out the appropriate CALL instruction, or we can put in a small JMP around the NOPs as we fill it out. and there's a number of tricks to do this pretty easily for all the possible points to hook in profiling stuff. -- Stewart Smith _______________________________________________ Mailing list: https://launchpad.net/~drizzle-discuss Post to : [email protected] Unsubscribe : https://launchpad.net/~drizzle-discuss More help : https://help.launchpad.net/ListHelp

