mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-17 17:44:40 +02:00
8221535: add steal tick related information to hs_error file [linux]
Reviewed-by: dholmes, goetz
This commit is contained in:
parent
3ca21234ce
commit
8f556345e1
4 changed files with 127 additions and 104 deletions
|
@ -227,6 +227,82 @@ julong os::physical_memory() {
|
|||
return phys_mem;
|
||||
}
|
||||
|
||||
static uint64_t initial_total_ticks = 0;
|
||||
static uint64_t initial_steal_ticks = 0;
|
||||
static bool has_initial_tick_info = false;
|
||||
|
||||
static void next_line(FILE *f) {
|
||||
int c;
|
||||
do {
|
||||
c = fgetc(f);
|
||||
} while (c != '\n' && c != EOF);
|
||||
}
|
||||
|
||||
bool os::Linux::get_tick_information(CPUPerfTicks* pticks, int which_logical_cpu) {
|
||||
FILE* fh;
|
||||
uint64_t userTicks, niceTicks, systemTicks, idleTicks;
|
||||
// since at least kernel 2.6 : iowait: time waiting for I/O to complete
|
||||
// irq: time servicing interrupts; softirq: time servicing softirqs
|
||||
uint64_t iowTicks = 0, irqTicks = 0, sirqTicks= 0;
|
||||
// steal (since kernel 2.6.11): time spent in other OS when running in a virtualized environment
|
||||
uint64_t stealTicks = 0;
|
||||
// guest (since kernel 2.6.24): time spent running a virtual CPU for guest OS under the
|
||||
// control of the Linux kernel
|
||||
uint64_t guestNiceTicks = 0;
|
||||
int logical_cpu = -1;
|
||||
const int required_tickinfo_count = (which_logical_cpu == -1) ? 4 : 5;
|
||||
int n;
|
||||
|
||||
memset(pticks, 0, sizeof(CPUPerfTicks));
|
||||
|
||||
if ((fh = fopen("/proc/stat", "r")) == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (which_logical_cpu == -1) {
|
||||
n = fscanf(fh, "cpu " UINT64_FORMAT " " UINT64_FORMAT " " UINT64_FORMAT " "
|
||||
UINT64_FORMAT " " UINT64_FORMAT " " UINT64_FORMAT " " UINT64_FORMAT " "
|
||||
UINT64_FORMAT " " UINT64_FORMAT " ",
|
||||
&userTicks, &niceTicks, &systemTicks, &idleTicks,
|
||||
&iowTicks, &irqTicks, &sirqTicks,
|
||||
&stealTicks, &guestNiceTicks);
|
||||
} else {
|
||||
// Move to next line
|
||||
next_line(fh);
|
||||
|
||||
// find the line for requested cpu faster to just iterate linefeeds?
|
||||
for (int i = 0; i < which_logical_cpu; i++) {
|
||||
next_line(fh);
|
||||
}
|
||||
|
||||
n = fscanf(fh, "cpu%u " UINT64_FORMAT " " UINT64_FORMAT " " UINT64_FORMAT " "
|
||||
UINT64_FORMAT " " UINT64_FORMAT " " UINT64_FORMAT " " UINT64_FORMAT " "
|
||||
UINT64_FORMAT " " UINT64_FORMAT " ",
|
||||
&logical_cpu, &userTicks, &niceTicks,
|
||||
&systemTicks, &idleTicks, &iowTicks, &irqTicks, &sirqTicks,
|
||||
&stealTicks, &guestNiceTicks);
|
||||
}
|
||||
|
||||
fclose(fh);
|
||||
if (n < required_tickinfo_count || logical_cpu != which_logical_cpu) {
|
||||
return false;
|
||||
}
|
||||
pticks->used = userTicks + niceTicks;
|
||||
pticks->usedKernel = systemTicks + irqTicks + sirqTicks;
|
||||
pticks->total = userTicks + niceTicks + systemTicks + idleTicks +
|
||||
iowTicks + irqTicks + sirqTicks + stealTicks + guestNiceTicks;
|
||||
|
||||
if (n > required_tickinfo_count + 3) {
|
||||
pticks->steal = stealTicks;
|
||||
pticks->has_steal_ticks = true;
|
||||
} else {
|
||||
pticks->steal = 0;
|
||||
pticks->has_steal_ticks = false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Return true if user is running as root.
|
||||
|
||||
bool os::have_special_privileges() {
|
||||
|
@ -1977,6 +2053,8 @@ void os::print_os_info(outputStream* st) {
|
|||
os::Linux::print_container_info(st);
|
||||
|
||||
os::Linux::print_virtualization_info(st);
|
||||
|
||||
os::Linux::print_steal_info(st);
|
||||
}
|
||||
|
||||
// Try to identify popular distros.
|
||||
|
@ -2265,6 +2343,24 @@ void os::Linux::print_virtualization_info(outputStream* st) {
|
|||
#endif
|
||||
}
|
||||
|
||||
void os::Linux::print_steal_info(outputStream* st) {
|
||||
if (has_initial_tick_info) {
|
||||
CPUPerfTicks pticks;
|
||||
bool res = os::Linux::get_tick_information(&pticks, -1);
|
||||
|
||||
if (res && pticks.has_steal_ticks) {
|
||||
uint64_t steal_ticks_difference = pticks.steal - initial_steal_ticks;
|
||||
uint64_t total_ticks_difference = pticks.total - initial_total_ticks;
|
||||
double steal_ticks_perc = 0.0;
|
||||
if (total_ticks_difference != 0) {
|
||||
steal_ticks_perc = (double) steal_ticks_difference / total_ticks_difference;
|
||||
}
|
||||
st->print_cr("Steal ticks since vm start: " UINT64_FORMAT, steal_ticks_difference);
|
||||
st->print_cr("Steal ticks percentage since vm start:%7.3f", steal_ticks_perc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void os::print_memory_info(outputStream* st) {
|
||||
|
||||
st->print("Memory:");
|
||||
|
@ -4989,6 +5085,15 @@ void os::init(void) {
|
|||
|
||||
Linux::initialize_os_info();
|
||||
|
||||
os::Linux::CPUPerfTicks pticks;
|
||||
bool res = os::Linux::get_tick_information(&pticks, -1);
|
||||
|
||||
if (res && pticks.has_steal_ticks) {
|
||||
has_initial_tick_info = true;
|
||||
initial_total_ticks = pticks.total;
|
||||
initial_steal_ticks = pticks.steal;
|
||||
}
|
||||
|
||||
// _main_thread points to the thread that created/loaded the JVM.
|
||||
Linux::_main_thread = pthread_self();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue