8234397: add OS uptime information to os::print_os_info output
Reviewed-by: clanger, dholmes, lucy
This commit is contained in:
parent
f67111067e
commit
14391e8046
@ -1384,6 +1384,8 @@ void os::print_os_info(outputStream* st) {
|
||||
st->print_cr("AIX kernel version %u.%u.%u.%u",
|
||||
(ver >> 24) & 0xFF, (ver >> 16) & 0xFF, (ver >> 8) & 0xFF, ver & 0xFF);
|
||||
|
||||
os::Posix::print_uptime_info(st);
|
||||
|
||||
os::Posix::print_rlimit_info(st);
|
||||
|
||||
os::Posix::print_load_average(st);
|
||||
|
@ -168,6 +168,22 @@ julong os::Bsd::available_memory() {
|
||||
return available;
|
||||
}
|
||||
|
||||
// for more info see :
|
||||
// https://man.openbsd.org/sysctl.2
|
||||
void os::Bsd::print_uptime_info(outputStream* st) {
|
||||
struct timeval boottime;
|
||||
size_t len = sizeof(boottime);
|
||||
int mib[2];
|
||||
mib[0] = CTL_KERN;
|
||||
mib[1] = KERN_BOOTTIME;
|
||||
|
||||
if (sysctl(mib, 2, &boottime, &len, NULL, 0) >= 0) {
|
||||
time_t bootsec = boottime.tv_sec;
|
||||
time_t currsec = time(NULL);
|
||||
os::print_dhm(st, "OS uptime:", (long) difftime(currsec, bootsec));
|
||||
}
|
||||
}
|
||||
|
||||
julong os::physical_memory() {
|
||||
return Bsd::physical_memory();
|
||||
}
|
||||
@ -1569,6 +1585,8 @@ void os::print_os_info(outputStream* st) {
|
||||
|
||||
os::Posix::print_uname_info(st);
|
||||
|
||||
os::Bsd::print_uptime_info(st);
|
||||
|
||||
os::Posix::print_rlimit_info(st);
|
||||
|
||||
os::Posix::print_load_average(st);
|
||||
|
@ -155,6 +155,8 @@ class Bsd {
|
||||
}
|
||||
}
|
||||
static int get_node_by_cpu(int cpu_id);
|
||||
|
||||
static void print_uptime_info(outputStream* st);
|
||||
};
|
||||
|
||||
#endif // OS_BSD_OS_BSD_HPP
|
||||
|
@ -2119,6 +2119,8 @@ void os::print_os_info(outputStream* st) {
|
||||
|
||||
os::Posix::print_uname_info(st);
|
||||
|
||||
os::Linux::print_uptime_info(st);
|
||||
|
||||
// Print warning if unsafe chroot environment detected
|
||||
if (unsafe_chroot_detected) {
|
||||
st->print("WARNING!! ");
|
||||
@ -2304,6 +2306,15 @@ void os::Linux::print_ld_preload_file(outputStream* st) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
void os::Linux::print_uptime_info(outputStream* st) {
|
||||
struct sysinfo sinfo;
|
||||
int ret = sysinfo(&sinfo);
|
||||
if (ret == 0) {
|
||||
os::print_dhm(st, "OS uptime:", (long) sinfo.uptime);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void os::Linux::print_container_info(outputStream* st) {
|
||||
if (!OSContainer::is_containerized()) {
|
||||
return;
|
||||
|
@ -103,6 +103,7 @@ class Linux {
|
||||
static void print_libversion_info(outputStream* st);
|
||||
static void print_proc_sys_info(outputStream* st);
|
||||
static void print_ld_preload_file(outputStream* st);
|
||||
static void print_uptime_info(outputStream* st);
|
||||
|
||||
public:
|
||||
struct CPUPerfTicks {
|
||||
|
@ -49,6 +49,7 @@
|
||||
#include <sys/utsname.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
#include <utmpx.h>
|
||||
|
||||
// Todo: provide a os::get_max_process_id() or similar. Number of processes
|
||||
// may have been configured, can be read more accurately from proc fs etc.
|
||||
@ -379,6 +380,27 @@ void os::Posix::print_load_average(outputStream* st) {
|
||||
st->cr();
|
||||
}
|
||||
|
||||
// boot/uptime information;
|
||||
// unfortunately it does not work on macOS and Linux because the utx chain has no entry
|
||||
// for reboot at least on my test machines
|
||||
void os::Posix::print_uptime_info(outputStream* st) {
|
||||
int bootsec = -1;
|
||||
int currsec = time(NULL);
|
||||
struct utmpx* ent;
|
||||
setutxent();
|
||||
while ((ent = getutxent())) {
|
||||
if (!strcmp("system boot", ent->ut_line)) {
|
||||
bootsec = ent->ut_tv.tv_sec;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bootsec != -1) {
|
||||
os::print_dhm(st, "OS uptime:", (long) (currsec-bootsec));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void os::Posix::print_rlimit_info(outputStream* st) {
|
||||
st->print("rlimit:");
|
||||
struct rlimit rlim;
|
||||
|
@ -41,6 +41,7 @@ protected:
|
||||
static void print_uname_info(outputStream* st);
|
||||
static void print_libversion_info(outputStream* st);
|
||||
static void print_load_average(outputStream* st);
|
||||
static void print_uptime_info(outputStream* st);
|
||||
|
||||
// Minimum stack size a thread can be created with (allowing
|
||||
// the VM to completely create the thread and enter user code).
|
||||
|
@ -1584,6 +1584,8 @@ void os::print_os_info(outputStream* st) {
|
||||
|
||||
os::Posix::print_uname_info(st);
|
||||
|
||||
os::Posix::print_uptime_info(st);
|
||||
|
||||
os::Solaris::print_libversion_info(st);
|
||||
|
||||
os::Posix::print_rlimit_info(st);
|
||||
|
@ -1591,6 +1591,11 @@ void os::print_os_info_brief(outputStream* st) {
|
||||
os::print_os_info(st);
|
||||
}
|
||||
|
||||
void os::win32::print_uptime_info(outputStream* st) {
|
||||
unsigned long long ticks = GetTickCount64();
|
||||
os::print_dhm(st, "OS uptime:", ticks/1000);
|
||||
}
|
||||
|
||||
void os::print_os_info(outputStream* st) {
|
||||
#ifdef ASSERT
|
||||
char buffer[1024];
|
||||
@ -1604,6 +1609,8 @@ void os::print_os_info(outputStream* st) {
|
||||
st->print("OS:");
|
||||
os::win32::print_windows_version(st);
|
||||
|
||||
os::win32::print_uptime_info(st);
|
||||
|
||||
#ifdef _LP64
|
||||
VM_Version::print_platform_virtualization_info(st);
|
||||
#endif
|
||||
|
@ -55,6 +55,7 @@ class win32 {
|
||||
static bool _has_exit_bug;
|
||||
|
||||
static void print_windows_version(outputStream* st);
|
||||
static void print_uptime_info(outputStream* st);
|
||||
|
||||
public:
|
||||
// Windows-specific interface:
|
||||
|
@ -928,6 +928,14 @@ void os::print_hex_dump(outputStream* st, address start, address end, int unitsi
|
||||
st->cr();
|
||||
}
|
||||
|
||||
void os::print_dhm(outputStream* st, const char* startStr, long sec) {
|
||||
long days = sec/86400;
|
||||
long hours = (sec/3600) - (days * 24);
|
||||
long minutes = (sec/60) - (days * 1440) - (hours * 60);
|
||||
if (startStr == NULL) startStr = "";
|
||||
st->print_cr("%s %ld days %ld:%02ld hours", startStr, days, hours, minutes);
|
||||
}
|
||||
|
||||
void os::print_instructions(outputStream* st, address pc, int unitsize) {
|
||||
st->print_cr("Instructions: (pc=" PTR_FORMAT ")", p2i(pc));
|
||||
print_hex_dump(st, pc - 256, pc + 256, unitsize);
|
||||
|
@ -632,6 +632,9 @@ class os: AllStatic {
|
||||
static void print_date_and_time(outputStream* st, char* buf, size_t buflen);
|
||||
static void print_instructions(outputStream* st, address pc, int unitsize);
|
||||
|
||||
// helper for output of seconds in days , hours and months
|
||||
static void print_dhm(outputStream* st, const char* startStr, long sec);
|
||||
|
||||
static void print_location(outputStream* st, intptr_t x, bool verbose = false);
|
||||
static size_t lasterror(char *buf, size_t len);
|
||||
static int get_last_error();
|
||||
|
Loading…
x
Reference in New Issue
Block a user