From 2781c2091efbb3853683fe301b6a6c29418cc5c8 Mon Sep 17 00:00:00 2001 From: Alexey Dokuchaev Date: Sat, 3 Mar 2018 09:54:21 +0000 Subject: [PATCH] - Collect CPU and memory statistics originally missing on FreeBSD - Adjust COMMENT and port description text for better readability --- benchmarks/apib/Makefile | 3 +- benchmarks/apib/files/patch-src_apib__cpu.c | 102 ++++++++++++++++++++ benchmarks/apib/pkg-descr | 2 +- 3 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 benchmarks/apib/files/patch-src_apib__cpu.c diff --git a/benchmarks/apib/Makefile b/benchmarks/apib/Makefile index ed73425df41e..a948456faf1f 100644 --- a/benchmarks/apib/Makefile +++ b/benchmarks/apib/Makefile @@ -3,10 +3,11 @@ PORTNAME= apib PORTVERSION= 1.0 +PORTREVISION= 1 CATEGORIES= benchmarks www MAINTAINER= danfe@FreeBSD.org -COMMENT= Simple, fast HTTP performance-testing tool +COMMENT= Simple and fast HTTP performance testing tool LICENSE= APACHE20 diff --git a/benchmarks/apib/files/patch-src_apib__cpu.c b/benchmarks/apib/files/patch-src_apib__cpu.c new file mode 100644 index 000000000000..5aa215d2a754 --- /dev/null +++ b/benchmarks/apib/files/patch-src_apib__cpu.c @@ -0,0 +1,102 @@ +--- src/apib_cpu.c.orig 2017-08-28 22:38:37 UTC ++++ src/apib_cpu.c +@@ -14,6 +14,11 @@ + limitations under the License. + */ + ++#ifdef __FreeBSD__ ++#include ++#include ++#include ++#endif + #include + #include + #include +@@ -35,6 +40,9 @@ static double TicksPerSecond; + * for hyperthreading, etc. */ + int cpu_Count(apr_pool_t* pool) + { ++#ifdef _SC_NPROCESSORS_ONLN ++ return (int)sysconf(_SC_NPROCESSORS_ONLN); ++#else + apr_status_t s; + apr_file_t* f; + char buf[PROC_BUF_LEN]; +@@ -66,10 +74,19 @@ int cpu_Count(apr_pool_t* pool) + count = 1; + } + return count; ++#endif + } + + static int getTicks(CPUUsage* cpu, apr_pool_t* pool) + { ++#ifdef __FreeBSD__ ++ struct tms ticks; ++ cpu->idle = times(&ticks); ++ if (cpu->idle == -1) ++ return 0; ++ cpu->nonIdle = ticks.tms_utime + ticks.tms_stime; ++ return 1; ++#else + apr_status_t s; + apr_file_t* proc; + char buf[PROC_BUF_LEN]; +@@ -118,10 +135,12 @@ static int getTicks(CPUUsage* cpu, apr_pool_t* pool) + } + + return 0; ++#endif + } + + double cpu_GetMemoryUsage(apr_pool_t* pool) + { ++#ifdef __linux__ + apr_status_t s; + apr_file_t* proc; + char buf[PROC_BUF_LEN]; +@@ -138,12 +157,36 @@ double cpu_GetMemoryUsage(apr_pool_t* pool) + if (s != APR_SUCCESS) { + return 0.0; + } ++#endif + + long totalMem = 0; + long freeMem = 0; + long buffers = 0; + long cache = 0; + ++#ifdef __FreeBSD__ ++ /* Let's work with kilobytes. */ ++ long pagesize = sysconf(_SC_PAGESIZE) / 1024; ++ totalMem = sysconf(_SC_PHYS_PAGES) * pagesize; ++ ++ size_t len; ++ ++ unsigned free; ++ len = sizeof(free); ++ sysctlbyname("vm.stats.vm.v_free_count", &free, &len, NULL, 0); ++ freeMem = free * pagesize; ++ ++ /* `buffers' is of expected type (long), no need for another variable. */ ++ len = sizeof(buffers); ++ sysctlbyname("vfs.bufspace", &buffers, &len, NULL, 0); ++ buffers /= 1024; ++ ++ /* `cache' is number of inactive pages since r309017. */ ++ unsigned inact; ++ len = sizeof(inact); ++ sysctlbyname("vm.stats.vm.v_inactive_count", &inact, &len, NULL, 0); ++ cache = inact * pagesize; ++#else + while (linep_NextLine(&line)) { + char* n = linep_NextToken(&line, " "); + char* v = linep_NextToken(&line, " "); +@@ -158,6 +201,7 @@ double cpu_GetMemoryUsage(apr_pool_t* pool) + cache = atol(v); + } + } ++#endif + + if ((totalMem <= 0) || (freeMem <= 0)) { + return 0.0; diff --git a/benchmarks/apib/pkg-descr b/benchmarks/apib/pkg-descr index d49929dfc7a9..1f49364a897b 100644 --- a/benchmarks/apib/pkg-descr +++ b/benchmarks/apib/pkg-descr @@ -2,7 +2,7 @@ apib is a tool that makes it easy to test API servers. It is supported on Unix systems that include the Apache Portable Runtime and OpenSSL. apib has most of the features of Apache Bench (ab), but is also intended -to be a more modern replacement. In particular, it supports: +to be a more modern replacement. In particular, it offers: - Proper HTTP 1.1 support including keep-alives and chunked encoding - Ability to spawn multiple I/O threads to take advantage of multiple