Re: division and cpu usage
How about this: === old_stime = task->stime; old_utime = task->utime old_j = jiffies; set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1 * HZ); new_stime = task->stime; new_utime = task->utime; new_j = jiffies; sum = ((new_stime - old_stime) + (new_utime - old_utime)) * 100 / (new_j - old_j) === I get how much time the task has spent in 1 sec in the scheduler and then get the percentage? Greets, Luka Jan Engelhardt pravi: > On Aug 28 2007 00:07, Luka Napotnik wrote: >>>>> 2. I'm trying to get the percentage of CPU used for a certain >>>>> task_struct and figured the following formula: >>>>> >>>>> (task->utime + task->stime) / jiffies >> This formula just doesn't work. I have a task with 99% CPU (top) but the >> result of that formula is random (4, sometimes 8). What am I doing >> wrong? Please help. > > You are calculating the CPU time the process has used since the start. > That is definitely not the same as the "%CPU" that top shows, more like > the "TIME+" top shows by default. > > signature.asc Description: OpenPGP digital signature
Re: division and cpu usage
How about this: === old_stime = task-stime; old_utime = task-utime old_j = jiffies; set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1 * HZ); new_stime = task-stime; new_utime = task-utime; new_j = jiffies; sum = ((new_stime - old_stime) + (new_utime - old_utime)) * 100 / (new_j - old_j) === I get how much time the task has spent in 1 sec in the scheduler and then get the percentage? Greets, Luka Jan Engelhardt pravi: On Aug 28 2007 00:07, Luka Napotnik wrote: 2. I'm trying to get the percentage of CPU used for a certain task_struct and figured the following formula: (task-utime + task-stime) / jiffies This formula just doesn't work. I have a task with 99% CPU (top) but the result of that formula is random (4, sometimes 8). What am I doing wrong? Please help. You are calculating the CPU time the process has used since the start. That is definitely not the same as the %CPU that top shows, more like the TIME+ top shows by default. signature.asc Description: OpenPGP digital signature
Re: division and cpu usage
Jan Engelhardt pravi: > On Aug 24 2007 07:34, linux-os (Dick Johnson) wrote: >>> I'm new to kernel development and have some questions. >>> >>> 1. Why can't I divide with regular casting to double ((double)a / >>> (double)b)? It gives me strange errors when compiling: >>> >>> WARNING: "__divdf3" [/root] undefined! >>> WARNING: "__addf3" [/root/...] undefined! >>> WARNING: "__floatsidf" [/root/...] undefined! >>> >>> And if I compile with normal integers, I get zero as the result. >>> >>> 2. I'm trying to get the percentage of CPU used for a certain >>> task_struct and figured the following formula: >>> >>> (task->utime + task->stime) / jiffies This formula just doesn't work. I have a task with 99% CPU (top) but the result of that formula is random (4, sometimes 8). What am I doing wrong? Please help. >>> >>> Before calculating I convert all the variables to jiffies. Is this correct? > > * So use integer math: (task->utime + task->stime) * 100 / jiffies > and you get the 'common' percentage. In integer, that is. > > * I am not sure about the use of jiffies when it comes to CONFIG_NO_HZ=y. > >> Floating point operations are not allowed in the kernel. Often, > > IIRC they are allowed since ... recently (2.6.16, .17? can't remember). When > the kernel tries to execute an FP instruction (and traps as a result), more > kernel code will enable that the FP stack gets properly switched when a > process > changes between userspace-kernelspace. > >> You can use "long long" for high precision math if necessary. > > That will give link failure for __udivdi3. Use do_div(). > > > Jan - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: division and cpu usage
Jan Engelhardt pravi: On Aug 24 2007 07:34, linux-os (Dick Johnson) wrote: I'm new to kernel development and have some questions. 1. Why can't I divide with regular casting to double ((double)a / (double)b)? It gives me strange errors when compiling: WARNING: __divdf3 [/root] undefined! WARNING: __addf3 [/root/...] undefined! WARNING: __floatsidf [/root/...] undefined! And if I compile with normal integers, I get zero as the result. 2. I'm trying to get the percentage of CPU used for a certain task_struct and figured the following formula: (task-utime + task-stime) / jiffies This formula just doesn't work. I have a task with 99% CPU (top) but the result of that formula is random (4, sometimes 8). What am I doing wrong? Please help. Before calculating I convert all the variables to jiffies. Is this correct? * So use integer math: (task-utime + task-stime) * 100 / jiffies and you get the 'common' percentage. In integer, that is. * I am not sure about the use of jiffies when it comes to CONFIG_NO_HZ=y. Floating point operations are not allowed in the kernel. Often, IIRC they are allowed since ... recently (2.6.16, .17? can't remember). When the kernel tries to execute an FP instruction (and traps as a result), more kernel code will enable that the FP stack gets properly switched when a process changes between userspace-kernelspace. You can use long long for high precision math if necessary. That will give link failure for __udivdi3. Use do_div(). Jan - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: division and cpu usage
Hello again. I have the following code: clock_t c_sum, j, p; cputime_t j_tmp; ... c_sum = cputime64_to_clock_t(task->utime) + cputime64_to_clock_t(task->stime); cur_j = jiffies; j_tmp = jiffies64_to_cputime64(cur_j); j = cputime64_to_clock_t(j_tmp); p = (c_sum * 100) / j; And if I check the p value of a certain process it gives wrong results. For example for a process using 99% of the CPU it shows 20. What am I doing wrong? Greets, Luka Jan Engelhardt pravi: > On Aug 24 2007 07:34, linux-os (Dick Johnson) wrote: >>> I'm new to kernel development and have some questions. >>> >>> 1. Why can't I divide with regular casting to double ((double)a / >>> (double)b)? It gives me strange errors when compiling: >>> >>> WARNING: "__divdf3" [/root] undefined! >>> WARNING: "__addf3" [/root/...] undefined! >>> WARNING: "__floatsidf" [/root/...] undefined! >>> >>> And if I compile with normal integers, I get zero as the result. >>> >>> 2. I'm trying to get the percentage of CPU used for a certain >>> task_struct and figured the following formula: >>> >>> (task->utime + task->stime) / jiffies >>> >>> Before calculating I convert all the variables to jiffies. Is this correct? > > * So use integer math: (task->utime + task->stime) * 100 / jiffies > and you get the 'common' percentage. In integer, that is. > > * I am not sure about the use of jiffies when it comes to CONFIG_NO_HZ=y. > >> Floating point operations are not allowed in the kernel. Often, > > IIRC they are allowed since ... recently (2.6.16, .17? can't remember). When > the kernel tries to execute an FP instruction (and traps as a result), more > kernel code will enable that the FP stack gets properly switched when a > process > changes between userspace-kernelspace. > >> You can use "long long" for high precision math if necessary. > > That will give link failure for __udivdi3. Use do_div(). > > > Jan - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: division and cpu usage
Hello again. I have the following code: clock_t c_sum, j, p; cputime_t j_tmp; ... c_sum = cputime64_to_clock_t(task-utime) + cputime64_to_clock_t(task-stime); cur_j = jiffies; j_tmp = jiffies64_to_cputime64(cur_j); j = cputime64_to_clock_t(j_tmp); p = (c_sum * 100) / j; And if I check the p value of a certain process it gives wrong results. For example for a process using 99% of the CPU it shows 20. What am I doing wrong? Greets, Luka Jan Engelhardt pravi: On Aug 24 2007 07:34, linux-os (Dick Johnson) wrote: I'm new to kernel development and have some questions. 1. Why can't I divide with regular casting to double ((double)a / (double)b)? It gives me strange errors when compiling: WARNING: __divdf3 [/root] undefined! WARNING: __addf3 [/root/...] undefined! WARNING: __floatsidf [/root/...] undefined! And if I compile with normal integers, I get zero as the result. 2. I'm trying to get the percentage of CPU used for a certain task_struct and figured the following formula: (task-utime + task-stime) / jiffies Before calculating I convert all the variables to jiffies. Is this correct? * So use integer math: (task-utime + task-stime) * 100 / jiffies and you get the 'common' percentage. In integer, that is. * I am not sure about the use of jiffies when it comes to CONFIG_NO_HZ=y. Floating point operations are not allowed in the kernel. Often, IIRC they are allowed since ... recently (2.6.16, .17? can't remember). When the kernel tries to execute an FP instruction (and traps as a result), more kernel code will enable that the FP stack gets properly switched when a process changes between userspace-kernelspace. You can use long long for high precision math if necessary. That will give link failure for __udivdi3. Use do_div(). Jan - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
division and cpu usage
Hello. I'm new to kernel development and have some questions. 1. Why can't I divide with regular casting to double ((double)a / (double)b)? It gives me strange errors when compiling: WARNING: "__divdf3" [/root] undefined! WARNING: "__addf3" [/root/...] undefined! WARNING: "__floatsidf" [/root/...] undefined! And if I compile with normal integers, I get zero as the result. 2. I'm trying to get the percentage of CPU used for a certain task_struct and figured the following formula: (task->utime + task->stime) / jiffies Before calculating I convert all the variables to jiffies. Is this correct? Please help. Greets, Lukla - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
division and cpu usage
Hello. I'm new to kernel development and have some questions. 1. Why can't I divide with regular casting to double ((double)a / (double)b)? It gives me strange errors when compiling: WARNING: __divdf3 [/root] undefined! WARNING: __addf3 [/root/...] undefined! WARNING: __floatsidf [/root/...] undefined! And if I compile with normal integers, I get zero as the result. 2. I'm trying to get the percentage of CPU used for a certain task_struct and figured the following formula: (task-utime + task-stime) / jiffies Before calculating I convert all the variables to jiffies. Is this correct? Please help. Greets, Lukla - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/