Konstantin Makarchev 2019-01-18 09:17:17 +03:00
parent 4aeac4dfe8
commit 2bb67fa1bf
1 changed files with 98 additions and 17 deletions

View File

@ -123,6 +123,69 @@
#endif #endif
#if defined(SIGAR_FREEBSD5) #if defined(SIGAR_FREEBSD5)
#if __FreeBSD_version >= 1200028
#define VMMETER_TYPE uint64_t
#else
#define VMMETER_TYPE u_int
#endif
struct __vmmeter {
VMMETER_TYPE v_vm_faults;
VMMETER_TYPE v_io_faults;
VMMETER_TYPE v_cow_faults;
VMMETER_TYPE v_cow_optim;
VMMETER_TYPE v_zfod;
VMMETER_TYPE v_ozfod;
VMMETER_TYPE v_swapin;
VMMETER_TYPE v_swapout;
VMMETER_TYPE v_swappgsin;
VMMETER_TYPE v_swappgsout;
VMMETER_TYPE v_vnodein;
VMMETER_TYPE v_vnodeout;
VMMETER_TYPE v_vnodepgsin;
VMMETER_TYPE v_vnodepgsout;
VMMETER_TYPE v_intrans;
VMMETER_TYPE v_reactivated;
VMMETER_TYPE v_pdwakeups;
VMMETER_TYPE v_pdpages;
VMMETER_TYPE v_pdshortfalls;
VMMETER_TYPE v_dfree;
VMMETER_TYPE v_pfree;
VMMETER_TYPE v_tfree;
VMMETER_TYPE v_forks;
VMMETER_TYPE v_vforks;
VMMETER_TYPE v_rforks;
VMMETER_TYPE v_kthreads;
VMMETER_TYPE v_forkpages;
VMMETER_TYPE v_vforkpages;
VMMETER_TYPE v_rforkpages;
VMMETER_TYPE v_kthreadpages;
VMMETER_TYPE v_swtch;
VMMETER_TYPE v_syscall;
VMMETER_TYPE v_trap;
VMMETER_TYPE v_intr;
VMMETER_TYPE v_soft;
u_int v_page_size;
u_int v_page_count;
u_int v_free_reserved;
u_int v_free_target;
u_int v_free_min;
u_int v_free_count;
u_int v_wire_count;
u_int v_active_count;
u_int v_inactive_target;
u_int v_inactive_count;
u_int v_laundry_count;
u_int v_pageout_free_min;
u_int v_interrupt_free_min;
u_int v_free_severe;
#if (__FreeBSD_version < 1200016)
u_int v_cache_count;
#endif
#if (__FreeBSD_version < 1100079)
u_int v_cache_min;
u_int v_cache_max;
#endif
};
#define KI_FD ki_fd #define KI_FD ki_fd
#define KI_PID ki_pid #define KI_PID ki_pid
@ -342,24 +405,21 @@ static int sigar_vmstat(sigar_t *sigar, vm_statistics_data_t *vmstat)
} }
} }
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
static int sigar_vmstat(sigar_t *sigar, struct vmmeter *vmstat) static int sigar_vmstat(sigar_t *sigar, struct __vmmeter *vmstat)
{ {
int status; size_t size;
size_t size = sizeof(unsigned int);
status = kread(sigar, vmstat, sizeof(*vmstat),
sigar->koffsets[KOFFSET_VMMETER]);
if (status == SIGAR_OK) {
return SIGAR_OK;
}
SIGAR_ZERO(vmstat); SIGAR_ZERO(vmstat);
/* derived from src/usr.bin/vmstat/vmstat.c */ /* derived from src/usr.bin/vmstat/vmstat.c */
/* only collect the ones we actually use */ /* only collect the ones we actually use */
#define GET_VM_STATS(cat, name, used) \ #define GET_VM_STATS(cat, name, used) do { \
if (used) sysctlbyname("vm.stats." #cat "." #name, &vmstat->name, &size, NULL, 0) if (used) { \
size = sizeof(vmstat->name); \
sysctlbyname("vm.stats." #cat "." #name, &vmstat->name, \
&size, NULL, 0); \
} \
} while (0)
/* sys */ /* sys */
GET_VM_STATS(sys, v_swtch, 0); GET_VM_STATS(sys, v_swtch, 0);
@ -399,7 +459,9 @@ static int sigar_vmstat(sigar_t *sigar, struct vmmeter *vmstat)
GET_VM_STATS(vm, v_active_count, 0); GET_VM_STATS(vm, v_active_count, 0);
GET_VM_STATS(vm, v_inactive_target, 0); GET_VM_STATS(vm, v_inactive_target, 0);
GET_VM_STATS(vm, v_inactive_count, 1); GET_VM_STATS(vm, v_inactive_count, 1);
#if (__FreeBSD_version < 1200016 )
GET_VM_STATS(vm, v_cache_count, 1); GET_VM_STATS(vm, v_cache_count, 1);
#endif
#if (__FreeBSD_version < 1100079 ) #if (__FreeBSD_version < 1100079 )
GET_VM_STATS(vm, v_cache_min, 0); GET_VM_STATS(vm, v_cache_min, 0);
GET_VM_STATS(vm, v_cache_max, 0); GET_VM_STATS(vm, v_cache_max, 0);
@ -442,7 +504,7 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
unsigned long mem_total; unsigned long mem_total;
#endif #endif
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
struct vmmeter vmstat; struct __vmmeter vmstat;
#elif defined(__OpenBSD__) || defined(__NetBSD__) #elif defined(__OpenBSD__) || defined(__NetBSD__)
struct uvmexp vmstat; struct uvmexp vmstat;
#endif #endif
@ -481,7 +543,11 @@ int sigar_mem_get(sigar_t *sigar, sigar_mem_t *mem)
kern *= sigar->pagesize; kern *= sigar->pagesize;
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
if ((status = sigar_vmstat(sigar, &vmstat)) == SIGAR_OK) { if ((status = sigar_vmstat(sigar, &vmstat)) == SIGAR_OK) {
#if (__FreeBSD_version < 1200016 )
kern = vmstat.v_cache_count + vmstat.v_inactive_count; kern = vmstat.v_cache_count + vmstat.v_inactive_count;
#else
kern = vmstat.v_inactive_count;
#endif
kern *= sigar->pagesize; kern *= sigar->pagesize;
mem->free = vmstat.v_free_count; mem->free = vmstat.v_free_count;
mem->free *= sigar->pagesize; mem->free *= sigar->pagesize;
@ -691,7 +757,7 @@ int sigar_swap_get(sigar_t *sigar, sigar_swap_t *swap)
swap->page_out = vmstat.pageouts; swap->page_out = vmstat.pageouts;
#elif defined(__FreeBSD__) #elif defined(__FreeBSD__)
struct kvm_swap kswap[1]; struct kvm_swap kswap[1];
struct vmmeter vmstat; struct __vmmeter vmstat;
if (getswapinfo_sysctl(kswap, 1) != SIGAR_OK) { if (getswapinfo_sysctl(kswap, 1) != SIGAR_OK) {
if (!sigar->kmem) { if (!sigar->kmem) {
@ -3057,8 +3123,13 @@ static int net_connection_get(sigar_net_connection_walker_t *walker, int proto)
int type, istcp = 0; int type, istcp = 0;
char *buf; char *buf;
const char *mibvar; const char *mibvar;
#if defined(__FreeBSD__) && (__FreeBSD_version >= 1200026)
struct xtcpcb *tp = NULL;
struct xinpcb *inp;
#else
struct tcpcb *tp = NULL; struct tcpcb *tp = NULL;
struct inpcb *inp; struct inpcb *inp;
#endif
struct xinpgen *xig, *oxig; struct xinpgen *xig, *oxig;
struct xsocket *so; struct xsocket *so;
size_t len; size_t len;
@ -3096,6 +3167,15 @@ static int net_connection_get(sigar_net_connection_walker_t *walker, int proto)
xig->xig_len > sizeof(struct xinpgen); xig->xig_len > sizeof(struct xinpgen);
xig = (struct xinpgen *)((char *)xig + xig->xig_len)) xig = (struct xinpgen *)((char *)xig + xig->xig_len))
{ {
#if defined(__FreeBSD__) && (__FreeBSD_version >= 1200026)
if (istcp) {
tp = (struct xtcpcb *)xig;
inp = &tp->xt_inp;
} else {
inp = (struct xinpcb *)xig;
}
so = &inp->xi_socket;
#else
if (istcp) { if (istcp) {
struct xtcpcb *cb = (struct xtcpcb *)xig; struct xtcpcb *cb = (struct xtcpcb *)xig;
tp = &cb->xt_tp; tp = &cb->xt_tp;
@ -3107,6 +3187,7 @@ static int net_connection_get(sigar_net_connection_walker_t *walker, int proto)
inp = &cb->xi_inp; inp = &cb->xi_inp;
so = &cb->xi_socket; so = &cb->xi_socket;
} }
#endif
if (so->xso_protocol != proto) { if (so->xso_protocol != proto) {
continue; continue;