Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Jun 2005 21:54:26 +0200
From:      Marcin Koziej <creep@daedalus.desk.pl>
To:        freebsd-hackers@freebsd.org, brooks@FreeBSD.org
Subject:   Tracking FreeBSD performance over time - what hackers want?
Message-ID:  <20050612195426.GA5248@daedalus.desk.pl>

next in thread | raw e-mail | index | archive | help

Hello Hackers!

I have an idea which could be used to track FreeBSD performance and regression testing. Please take a look and give Your opinion on how usefull that would be for the FreeBSD project.


The basis for this system would be hijacking certain functions execution with injected code. Hijacker program runs target binary with LD_PRELOAD to inject some code (code doing statistics, tests, etc..) and installs redirections using ptrace (injecting jump instructions here and there). It then deattaches and the program runs almost as normal. (A little demo of how this might look later).

This approach has its pros and cons:
+ no context switch to fire hijacking code
+ flexible - You can hijack any function that has a symbol. Hijacking PLT (done) and relocations in shared libraries (will be done) included.
+ transparent - there needs to be no modiffication in target binary; hackers don't own all the hardware. It's hard to ask people with interesting equipement to recompile their binaries with profiling options. This would allow them to measure performance without changing their system.
+ small performance impact - put code only in places You want, and put there only the code which is needed there. (can be made O(1) unless You make it worse)

- ABI / Architecture dependent
- needs all the shared library mechanism to inject code (LD_PRELOAD)
- needs symbols
- writes the ro code pages on installing the redirections (negligible?)

And here is the demo of poc code (not particulary usefull..but..)
This hijack code has a static table indexed by read sizes in which we count how many times a read of this size was called.
------------------------------------
#include <hijack.h>
#include <stdio.h>

#define PROBES 400
#define QUANT 0x10
static int stats[PROBES];
static int max_read;
// RV(type) gives return value of the code

HIJACK(int, read, (int fd, char *buf, size_t size),
/* before call*/
,
/* after call*/
	printf("read() = %d\n", RV(int));
	if (max_read < RV(int))
		max_read = RV(int);
	if ((RV(int) >=0) && (RV(int) < QUANT * PROBES))
	{
		stats[RV(int) / QUANT]++;
	}

)

HIJACK(int, main, (),
	printf("hello hijacking!\n");
,
)

HIJACK(int, exit, (),
	int i;
	for (i=0; i<PROBES; i++)
		if (stats[i])
			fprintf(stdout,"%04d %04d\n", i*QUANT, stats[i]);
	fprintf(stdout,"and max read was %d\n", max_read);
	fclose(stdout);
	printf("finish!\n");
	return RV(int);
	,
)
----------------------
i compile it
gcc -o apa.so -shared -I. apa.c hijack.c
(hijack.c has some required runtime functions)

I run it on apache:

./hijack -c ./apa.so -h *libc.so.5:read -h *libc.so*:exit -h main /usr/local/sbin/httpd -X
hello
read() = 4096
read() = 4096
read() = 2732
(some of these....)
read() = 0
read() = 961
read() = 425
read() = 0
(here i press ^C)
0000 0010
0112 0002
0256 0002
0416 0003
0512 0002
0656 0002
0960 0001
1120 0002
2720 0002
4096 0046
and max read was 4096
------------------------------------

So, again, please send Your opinions on this idea. Do You think this (+ all needed utilities to do statistics etc) would be applicable to Summer Of Code "Tracking performance over time" project?


best regards,
-- 
Marcin Koziej



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050612195426.GA5248>