Προς το περιεχόμενο

Χρονομετρητες σε Ubuntu και debian


priest91

Προτεινόμενες αναρτήσεις

Εχω φτιαξει ενα προγραμματακι που χρονομετραει σε real time σε cpu time σε user time και σε kernel time μια εφαρμογη χρησιμοποιωντας τους ITIMER_REAL ITIMER_VIRTUAL και ITIMER_PROF χρονομετρητες..

Σε ubuntu 10.04 καταφερνω και αυξανω τον kernel time σε debian δε τα καταφερνω καλωντας τα ιδια syscalls..

 

Ξερετε τι μπορει να φταει γι αυτο;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

οχι το ubuntu ειναι σε laptop ενω το debian ειναι σε pc της σχολης..

το εχω τρεξει και σε ubuntu σε αλλο pc και κανει κανονικα αυτο που θελω οπως και σε fedora κανει αυτο που θελω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τί kernel τρέχει το debian; Για εκδόσεις πρίν τον 2.6.20 περίπου μπορεί να χρειάζεσαι διαφορετικό κώδικα γιατί τότε ο timer του kernel μέτραγε σε jiffies. Σου επιστρέφει κάποιο errno;

Δώσε μας κώδικα, kernel version και libc version.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

πως βρισκω το kernel version και το libc version?

δε μου επιστρεφει καποιο errno.

αυτο που κανω ειναι να δημιουργω και να διαγραφω εναν φακελο καπου 500 φορες με mkdir() kai rmdir() ωστε να μεγαλωσει το kernel time

μιας και ειναι ασκηση καλο θα ηταν να μην γραψω εδω τον κωδικα..

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

libc = 2.3.6 το βρηκα ετσι γιατι δε μπορω να δω τον package manager ζηταει root κωδικο τον οποιο δεν εχω..

#include <stdio.h>

#include <gnu/libc-version.h>

int main (void) { puts (gnu_get_libc_version ()); return 0; }

 

 

kernel = 2.6.18-4-686

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>    signal(SIGALRM,child2_handler);
		signal(SIGVTALRM,child2_handler);
		signal(SIGPROF,child2_handler);
		
		/* set the child 2 itimers */
		if(setitimer(ITIMER_PROF,&c2_proft,NULL) == -1)
			printf("Child 2 ITIMER_PROF error set\n");
		if(setitimer(ITIMER_REAL,&c2_realt,NULL) ==  -1)
			printf("Child 2 ITIMER_REAL error set\n");
		if(setitimer(ITIMER_VIRTUAL,&c2_virtt,NULL) == -1)
			printf("Child 2 ITIMER_VIRTUAL error set\n");

		/*start yourfunction() at child 2*/
		res = increasekerneltime();
		
		/* Read the child 2 itimer values, and report them */
		getitimer(ITIMER_PROF,&c2_proft);


		getitimer(ITIMER_REAL,&c2_realt);
		getitimer(ITIMER_VIRTUAL,&c2_virtt);
		printf("\n");

		printf("Child 2 res = %ld, real time = %ld sec\n",res, c2_realt_secs);
		printf("Child 2 res = %ld, cpu time = %ld sec\n",res, c2_proft_secs);
		printf("Child 2 res = %ld, user time = %ld sec\n",res, c2_virtt_secs);
		printf("Child 2 res = %ld ,kernel time = %ld sec\n",res, c2_proft_secs - c2_virtt_secs);

οπου increasekerneltime(){

>long unsigned int increasekerneltime(){
int i;

for(i=0;i<500000;i++){

	chdir("/home/Desktop");
	mkdir("APOTOPROGRAMMA",777);
	rmdir("APOTOPROGRAMMA");
}
	
	
}

 

ο χρονομετρητης ειναι σεταρισμενος ετσι ωστε να μηδενιζεται ανα δευτερολεπτο

και οταν μηδενιζεται στελνει το αντιστοιχο σημα το οποιο χειριζομαι για να αυξησω μια static μεταβλητη κατα 1

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το μόνο που μπορώ να σου δώσω είναι ένα εντελώς sample κώδικα, ελαφρώς διαφορετικό από το δικό σου.

Κάτι τέτοιο:

>#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>

void thandler (int signal) {
   static int count = 0;
   printf ("counter %i\n", ++count);
}

int main () {
   struct sigaction sa;
   struct itimerval timer;

   memset (&sa, 0, sizeof (sa));
   sa.sa_handler = &thandler;
   sigaction (SIGVTALRM, &sa, NULL);

   timer.it_value.tv_sec = 0;
   timer.it_value.tv_usec = 250000;
   timer.it_interval.tv_sec = 0;
   timer.it_interval.tv_usec = 250000;

   setitimer (ITIMER_VIRTUAL, &timer, NULL);
   while (1);
}

Το οποίο κάνει expire τον timer κάθε 250 milliseconds. Η διαφορά ουσιαστικά με τον δικό σου είναι η χρήση του sigaction. Λείπουν διάφορα πράγματα από τον δικό σου κώδικα (λογικό, αφού θέλεις να το κάνεις μόνος σου σαν άσκηση) οπότε δέν ξέρω αν ο παραπάνω κώδικας θα σου λύσει το θέμα. Όταν λές οτι στο debian δέν παίζει, τί τιμές σου δίνει δηλαδή;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

τρεχει το φιμπονατσι 42 ωστε να αυξησω το cpu time

Child 1 res = 267914296, real time = 6 sec

Child 1 res = 267914296, cpu time = 6 sec

Child 1 res = 267914296, user time = 6 sec

Child 1 res = 267914296, kernel time = 0 sec

 

τρεχει το increasekernel time και εμφανιζει αυτα

Child 2 res = 0, real time = 12 sec

Child 2 res = 0, cpu time = 0 sec

Child 2 res = 0, user time = 0 sec

Child 2 res = 0 ,kernel time = 0 sec

 

σε ubuntu στο child2 το kernel time ειναι ισο με το real time οπως θελω να ειναι

 

τελικα καταλαβα τι ειναι λαθος..

για καποιο λογο δεν διαχειριζεται τα signals SIGVALRM και SIGPROF αλλα στο child1 μπορει ενω στο 2 οχι

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κοίτα, άν το πρόβλημα είναι μόνο στο child 2 τότε υπάρχει ενδεχόμενο να μήν φταίει το πρόγραμμά σου αλλά το operation που κάνεις και μτρεάς το user και cpu time, δηλαδή το mkdir και rmdir. Από απλή περιέργεια, στο Ubuntu και στο Fedora που λές, κάνε ένα copy εδώ το /etc/fstab αρχείο ή κοίτα μόνος σου να δείς άν υπάρχει κάποιο option από τα atime/realtime/strictatime.

Αυτό μπορεί να επηρρεάσει τελικά το kernel time που παίρνεις πίσω από την itimeval.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...