From e5dfb9efc34f1b2e55333a239b6d4b54905205c8 Mon Sep 17 00:00:00 2001 From: "roberto@debian32" Date: Sun, 23 Oct 2011 12:04:02 +0200 Subject: [PATCH] improved get_memusage --- logging.c | 34 ++++++++++++++++----------------- plugins/python/uwsgi_pymodule.c | 7 ++++--- utils.c | 13 ++++++++----- uwsgi.h | 2 +- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/logging.c b/logging.c index 892c2b74..fa257872 100644 --- a/logging.c +++ b/logging.c @@ -129,22 +129,22 @@ void log_request(struct wsgi_request *wsgi_req) { rlen = writev(2, logvec, logvecpos+1); } -void get_memusage() { +void get_memusage(uint64_t *rss, uint64_t *vsz) { #ifdef UNBIT - uwsgi.workers[uwsgi.mywid].vsz_size = syscall(356); + *vsz = syscall(356); #elif defined(__linux__) FILE *procfile; int i; procfile = fopen("/proc/self/stat", "r"); if (procfile) { - i = fscanf(procfile, "%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %llu %lld", (unsigned long long *) &uwsgi.workers[uwsgi.mywid].vsz_size, (unsigned long long *) &uwsgi.workers[uwsgi.mywid].rss_size); + i = fscanf(procfile, "%*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %*s %llu %lld", (unsigned long long *) vsz, (unsigned long long *) rss); if (i != 2) { uwsgi_log( "warning: invalid record in /proc/self/stat\n"); } fclose(procfile); } - uwsgi.workers[uwsgi.mywid].rss_size = uwsgi.workers[uwsgi.mywid].rss_size * uwsgi.page_size; + *rss = *rss * uwsgi.page_size; #elif defined (__sun__) psinfo_t info; int procfd; @@ -152,8 +152,8 @@ void get_memusage() { procfd = open("/proc/self/psinfo", O_RDONLY); if (procfd >= 0) { if ( read(procfd, (char *) &info, sizeof(info)) > 0) { - uwsgi.workers[uwsgi.mywid].rss_size = (uint64_t) info.pr_rssize * 1024; - uwsgi.workers[uwsgi.mywid].vsz_size = (uint64_t) info.pr_size * 1024; + *rss = (uint64_t) info.pr_rssize * 1024; + *vsz = (uint64_t) info.pr_size * 1024; } close(procfd); } @@ -164,8 +164,8 @@ void get_memusage() { mach_msg_type_number_t t_size = sizeof(struct task_basic_info); if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) & t_info, &t_size) == KERN_SUCCESS) { - uwsgi.workers[uwsgi.mywid].rss_size = t_info.resident_size; - uwsgi.workers[uwsgi.mywid].vsz_size = t_info.virtual_size; + *rss = t_info.resident_size; + *vsz = t_info.virtual_size; } #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) kvm_t *kv; @@ -184,8 +184,8 @@ void get_memusage() { struct kinfo_proc *kproc; kproc = kvm_getprocs(kv, KERN_PROC_PID, uwsgi.mypid, &cnt); if (kproc && cnt > 0) { - uwsgi.workers[uwsgi.mywid].vsz_size = kproc->ki_size; - uwsgi.workers[uwsgi.mywid].rss_size = kproc->ki_rssize * uwsgi.page_size; + *vsz = kproc->ki_size; + *rss = kproc->ki_rssize * uwsgi.page_size; } #elif defined(__NetBSD__) || defined(__OpenBSD__) struct kinfo_proc2 *kproc2; @@ -193,11 +193,11 @@ void get_memusage() { kproc2 = kvm_getproc2(kv, KERN_PROC_PID, uwsgi.mypid, sizeof(struct kinfo_proc2), &cnt); if (kproc2 && cnt > 0) { #ifdef __OpenBSD__ - uwsgi.workers[uwsgi.mywid].vsz_size = (kproc2->p_vm_dsize + kproc2->p_vm_ssize + kproc2->p_vm_tsize) * uwsgi.page_size; + *vsz = (kproc2->p_vm_dsize + kproc2->p_vm_ssize + kproc2->p_vm_tsize) * uwsgi.page_size; #else - uwsgi.workers[uwsgi.mywid].vsz_size = kproc2->p_vm_msize * uwsgi.page_size; + *vsz = kproc2->p_vm_msize * uwsgi.page_size; #endif - uwsgi.workers[uwsgi.mywid].rss_size = kproc2->p_vm_rssize * uwsgi.page_size; + *rss = kproc2->p_vm_rssize * uwsgi.page_size; } #endif @@ -207,12 +207,12 @@ void get_memusage() { area_info ai; int32 cookie; - uwsgi.workers[uwsgi.mywid].vsz_size = 0; - uwsgi.workers[uwsgi.mywid].rss_size = 0; + *vsz = 0; + *rss = 0; while(get_next_area_info(0, &cookie, &ai) == B_OK) { - uwsgi.workers[uwsgi.mywid].vsz_size += ai.ram_size; + *vsz += ai.ram_size; if ( (ai.protection & B_WRITE_AREA) != 0) { - uwsgi.workers[uwsgi.mywid].rss_size += ai.ram_size; + *rss += ai.ram_size; } } #endif diff --git a/plugins/python/uwsgi_pymodule.c b/plugins/python/uwsgi_pymodule.c index 93bf0d22..31b910df 100644 --- a/plugins/python/uwsgi_pymodule.c +++ b/plugins/python/uwsgi_pymodule.c @@ -2492,12 +2492,13 @@ PyObject *py_uwsgi_logsize(PyObject * self, PyObject * args) { PyObject *py_uwsgi_mem(PyObject * self, PyObject * args) { + uint64_t rss=0, vsz = 0; PyObject *ml = PyTuple_New(2); - get_memusage(); + get_memusage(&rss, &vsz); - PyTuple_SetItem(ml, 0, PyLong_FromUnsignedLongLong(uwsgi.workers[uwsgi.mywid].rss_size)); - PyTuple_SetItem(ml, 1, PyLong_FromUnsignedLongLong(uwsgi.workers[uwsgi.mywid].vsz_size)); + PyTuple_SetItem(ml, 0, PyLong_FromUnsignedLongLong(rss)); + PyTuple_SetItem(ml, 1, PyLong_FromUnsignedLongLong(vsz)); return ml; diff --git a/utils.c b/utils.c index 162d0cbe..42b03f3e 100644 --- a/utils.c +++ b/utils.c @@ -753,7 +753,7 @@ void uwsgi_close_request(struct wsgi_request *wsgi_req) { int waitpid_status; int tmp_id; - uint64_t tmp_rt; + uint64_t tmp_rt, rss = 0, vsz = 0; gettimeofday(&wsgi_req->end_of_request, NULL); @@ -763,8 +763,11 @@ void uwsgi_close_request(struct wsgi_request *wsgi_req) { uwsgi.workers[uwsgi.mywid].avg_response_time = (uwsgi.workers[uwsgi.mywid].avg_response_time+tmp_rt)/2; // get memory usage - if (uwsgi.shared->options[UWSGI_OPTION_MEMORY_DEBUG] == 1 || uwsgi.force_get_memusage ) - get_memusage(); + if (uwsgi.shared->options[UWSGI_OPTION_MEMORY_DEBUG] == 1 || uwsgi.force_get_memusage ) { + get_memusage(&rss, &vsz); + uwsgi.workers[uwsgi.mywid].vsz_size = vsz; + uwsgi.workers[uwsgi.mywid].rss_size = rss; + } // close the connection with the webserver @@ -813,11 +816,11 @@ void uwsgi_close_request(struct wsgi_request *wsgi_req) { goodbye_cruel_world(); } - if (uwsgi.reload_on_as && (rlim_t) uwsgi.workers[uwsgi.mywid].vsz_size >= uwsgi.reload_on_as) { + if (uwsgi.reload_on_as && (rlim_t) vsz >= uwsgi.reload_on_as) { goodbye_cruel_world(); } - if (uwsgi.reload_on_rss && (rlim_t) uwsgi.workers[uwsgi.mywid].rss_size >= uwsgi.reload_on_rss) { + if (uwsgi.reload_on_rss && (rlim_t) rss >= uwsgi.reload_on_rss) { goodbye_cruel_world(); } diff --git a/uwsgi.h b/uwsgi.h index 40a1cc88..297916ac 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1780,7 +1780,7 @@ void daemonize(char *); void logto(char *); void log_request(struct wsgi_request *); -void get_memusage(void); +void get_memusage(uint64_t *, uint64_t *); void harakiri(void); void stats(int);