# HG changeset patch # User mbaesken # Date 1574327214 -3600 # Thu Nov 21 10:06:54 2019 +0100 # Node ID a0f01e10daf99a4ffe780bb4736f0b8b38c3689f # Parent 580fb715b29d82439ab7174d9277b5eeb9d27514 8234397: add OS uptime information to os::print_os_info output diff --git a/src/hotspot/os/aix/os_aix.cpp b/src/hotspot/os/aix/os_aix.cpp --- a/src/hotspot/os/aix/os_aix.cpp +++ b/src/hotspot/os/aix/os_aix.cpp @@ -1385,6 +1385,8 @@ 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); diff --git a/src/hotspot/os/bsd/os_bsd.cpp b/src/hotspot/os/bsd/os_bsd.cpp --- a/src/hotspot/os/bsd/os_bsd.cpp +++ b/src/hotspot/os/bsd/os_bsd.cpp @@ -169,6 +169,22 @@ return available; } +// for more info see : +// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sysctl.3.html +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, currsec = time(NULL); + double tdiff = difftime(currsec, bootsec); + st->print_cr("OS uptime (in days): %.2lf", tdiff/(60.0*60.0*24.0)); + } +} + julong os::physical_memory() { return Bsd::physical_memory(); } @@ -1570,6 +1586,8 @@ os::Posix::print_uname_info(st); + os::Bsd::print_uptime_info(st); + os::Posix::print_rlimit_info(st); os::Posix::print_load_average(st); diff --git a/src/hotspot/os/bsd/os_bsd.hpp b/src/hotspot/os/bsd/os_bsd.hpp --- a/src/hotspot/os/bsd/os_bsd.hpp +++ b/src/hotspot/os/bsd/os_bsd.hpp @@ -155,6 +155,8 @@ } } static int get_node_by_cpu(int cpu_id); + + static void print_uptime_info(outputStream* st); }; #endif // OS_BSD_OS_BSD_HPP diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp --- a/src/hotspot/os/linux/os_linux.cpp +++ b/src/hotspot/os/linux/os_linux.cpp @@ -2120,6 +2120,8 @@ 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!! "); @@ -2305,6 +2307,15 @@ st->cr(); } +void os::Linux::print_uptime_info(outputStream* st) { + struct sysinfo sinfo; + int ret = sysinfo(&sinfo); + if (ret == 0) { + st->print_cr("OS uptime (in days): %.2lf", (double) sinfo.uptime/(60*60*24) ); + } +} + + void os::Linux::print_container_info(outputStream* st) { if (!OSContainer::is_containerized()) { return; diff --git a/src/hotspot/os/linux/os_linux.hpp b/src/hotspot/os/linux/os_linux.hpp --- a/src/hotspot/os/linux/os_linux.hpp +++ b/src/hotspot/os/linux/os_linux.hpp @@ -103,6 +103,7 @@ 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 { diff --git a/src/hotspot/os/posix/os_posix.cpp b/src/hotspot/os/posix/os_posix.cpp --- a/src/hotspot/os/posix/os_posix.cpp +++ b/src/hotspot/os/posix/os_posix.cpp @@ -47,6 +47,7 @@ #include #include #include +#include // 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. @@ -377,6 +378,27 @@ st->cr(); } +// boot/uptime information; +// unfortunately it does not work on macOS 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) { + st->print_cr("OS uptime (in days): %.2lf", (double) (currsec-bootsec)/(60*60*24)); + } +} + + void os::Posix::print_rlimit_info(outputStream* st) { st->print("rlimit:"); struct rlimit rlim; diff --git a/src/hotspot/os/posix/os_posix.hpp b/src/hotspot/os/posix/os_posix.hpp --- a/src/hotspot/os/posix/os_posix.hpp +++ b/src/hotspot/os/posix/os_posix.hpp @@ -41,6 +41,7 @@ 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). diff --git a/src/hotspot/os/solaris/os_solaris.cpp b/src/hotspot/os/solaris/os_solaris.cpp --- a/src/hotspot/os/solaris/os_solaris.cpp +++ b/src/hotspot/os/solaris/os_solaris.cpp @@ -1584,6 +1584,8 @@ os::Posix::print_uname_info(st); + os::Posix::print_uptime_info(st); + os::Solaris::print_libversion_info(st); os::Posix::print_rlimit_info(st); diff --git a/src/hotspot/os/windows/os_windows.cpp b/src/hotspot/os/windows/os_windows.cpp --- a/src/hotspot/os/windows/os_windows.cpp +++ b/src/hotspot/os/windows/os_windows.cpp @@ -1604,6 +1604,9 @@ st->print("OS:"); os::win32::print_windows_version(st); + unsigned long long ticks = GetTickCount64(); + st->print_cr("OS uptime (in days): %.2lf", (double) ((double)ticks/(1000.0*60.0*60.0*24.0))); + #ifdef _LP64 VM_Version::print_platform_virtualization_info(st); #endif