8234397: add OS uptime information to os::print_os_info output

Reviewed-by: clanger, dholmes, lucy
This commit is contained in:
Matthias Baesken 2019-12-03 15:17:59 +01:00
parent f67111067e
commit 14391e8046
12 changed files with 78 additions and 0 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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 {

View File

@ -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;

View File

@ -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).

View File

@ -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);

View File

@ -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

View File

@ -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:

View File

@ -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);

View File

@ -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();