| 1 | #include "uwsgi.h" |
|---|
| 2 | |
|---|
| 3 | #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) |
|---|
| 4 | #include <kvm.h> |
|---|
| 5 | #include <sys/user.h> |
|---|
| 6 | #elif defined(__sun__) |
|---|
| 7 | |
|---|
| 8 | #ifndef _LP64 |
|---|
| 9 | #undef _FILE_OFFSET_BITS |
|---|
| 10 | #endif |
|---|
| 11 | #include <procfs.h> |
|---|
| 12 | #define _FILE_OFFSET_BITS 64 |
|---|
| 13 | #endif |
|---|
| 14 | |
|---|
| 15 | #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) |
|---|
| 16 | #include <sys/sysctl.h> |
|---|
| 17 | #endif |
|---|
| 18 | |
|---|
| 19 | extern struct uwsgi_server uwsgi; |
|---|
| 20 | |
|---|
| 21 | void log_request(struct wsgi_request *wsgi_req) { |
|---|
| 22 | |
|---|
| 23 | |
|---|
| 24 | char *time_request; |
|---|
| 25 | time_t microseconds, microseconds2; |
|---|
| 26 | int rlen; |
|---|
| 27 | int app_req = -1; |
|---|
| 28 | char *msg2 = " "; |
|---|
| 29 | char *via = msg2; |
|---|
| 30 | |
|---|
| 31 | char mempkt[4096]; |
|---|
| 32 | char logpkt[4096]; |
|---|
| 33 | |
|---|
| 34 | struct iovec logvec[4] ; |
|---|
| 35 | int logvecpos = 0 ; |
|---|
| 36 | |
|---|
| 37 | #ifdef UWSGI_SENDFILE |
|---|
| 38 | char *msg1 = " via sendfile() "; |
|---|
| 39 | |
|---|
| 40 | struct uwsgi_app *wi; |
|---|
| 41 | |
|---|
| 42 | if (wsgi_req->app_id >= 0) { |
|---|
| 43 | wi = &uwsgi.wsgi_apps[wsgi_req->app_id]; |
|---|
| 44 | if (wi->requests > 0) { |
|---|
| 45 | app_req = wi->requests; |
|---|
| 46 | } |
|---|
| 47 | } |
|---|
| 48 | |
|---|
| 49 | if (wsgi_req->sendfile_fd > -1) { |
|---|
| 50 | via = msg1; |
|---|
| 51 | } |
|---|
| 52 | #endif |
|---|
| 53 | |
|---|
| 54 | time_request = ctime((const time_t *) &wsgi_req->start_of_request.tv_sec); |
|---|
| 55 | microseconds = wsgi_req->end_of_request.tv_sec * 1000000 + wsgi_req->end_of_request.tv_usec; |
|---|
| 56 | microseconds2 = wsgi_req->start_of_request.tv_sec * 1000000 + wsgi_req->start_of_request.tv_usec; |
|---|
| 57 | |
|---|
| 58 | if (uwsgi.vhost) { |
|---|
| 59 | logvec[logvecpos].iov_base = wsgi_req->host ; |
|---|
| 60 | logvec[logvecpos].iov_len = wsgi_req->host_len ; |
|---|
| 61 | logvecpos++; |
|---|
| 62 | |
|---|
| 63 | logvec[logvecpos].iov_base = " " ; |
|---|
| 64 | logvec[logvecpos].iov_len = 1 ; |
|---|
| 65 | logvecpos++; |
|---|
| 66 | } |
|---|
| 67 | |
|---|
| 68 | if (uwsgi.shared->options[UWSGI_OPTION_MEMORY_DEBUG] == 1) { |
|---|
| 69 | #ifndef UNBIT |
|---|
| 70 | rlen = snprintf(mempkt, 4096, "{address space usage: %lld bytes/%lluMB} {rss usage: %llu bytes/%lluMB} ", |
|---|
| 71 | (unsigned long long) uwsgi.workers[uwsgi.mywid].vsz_size, (unsigned long long ) uwsgi.workers[uwsgi.mywid].vsz_size / 1024 / 1024, |
|---|
| 72 | (unsigned long long) uwsgi.workers[uwsgi.mywid].rss_size, (unsigned long long ) uwsgi.workers[uwsgi.mywid].rss_size / 1024 / 1024); |
|---|
| 73 | #else |
|---|
| 74 | rlen = snprintf(mempkt, 4096, "{address space usage: %lld bytes/%lluMB} ", |
|---|
| 75 | (unsigned long long) uwsgi.workers[uwsgi.mywid].vsz_size, (unsigned long long) uwsgi.workers[uwsgi.mywid].vsz_size / 1024 / 1024); |
|---|
| 76 | #endif |
|---|
| 77 | |
|---|
| 78 | |
|---|
| 79 | logvec[logvecpos].iov_base = mempkt ; |
|---|
| 80 | logvec[logvecpos].iov_len = rlen ; |
|---|
| 81 | logvecpos++; |
|---|
| 82 | |
|---|
| 83 | |
|---|
| 84 | } |
|---|
| 85 | |
|---|
| 86 | rlen = snprintf(logpkt, 4096, "[pid: %d|app: %d|req: %d/%llu] %.*s (%.*s) {%d vars in %d bytes} [%.*s] %.*s %.*s => generated %llu bytes in %ld msecs%s(%.*s %d) %d headers in %d bytes (%d async switches on async core %d)\n", |
|---|
| 87 | uwsgi.mypid, |
|---|
| 88 | wsgi_req->app_id, |
|---|
| 89 | app_req, |
|---|
| 90 | (unsigned long long ) uwsgi.workers[0].requests, |
|---|
| 91 | wsgi_req->remote_addr_len, wsgi_req->remote_addr, |
|---|
| 92 | wsgi_req->remote_user_len, wsgi_req->remote_user, |
|---|
| 93 | wsgi_req->var_cnt, |
|---|
| 94 | wsgi_req->uh.pktsize, |
|---|
| 95 | 24, time_request, |
|---|
| 96 | wsgi_req->method_len, wsgi_req->method, |
|---|
| 97 | wsgi_req->uri_len, wsgi_req->uri, |
|---|
| 98 | (unsigned long long) wsgi_req->response_size, |
|---|
| 99 | (long int) (microseconds - microseconds2) / 1000, |
|---|
| 100 | via, |
|---|
| 101 | wsgi_req->protocol_len, wsgi_req->protocol, |
|---|
| 102 | wsgi_req->status, |
|---|
| 103 | wsgi_req->header_cnt, |
|---|
| 104 | wsgi_req->headers_size, |
|---|
| 105 | wsgi_req->async_switches, wsgi_req->async_id); |
|---|
| 106 | |
|---|
| 107 | logvec[logvecpos].iov_base = logpkt ; |
|---|
| 108 | logvec[logvecpos].iov_len = rlen ; |
|---|
| 109 | |
|---|
| 110 | |
|---|
| 111 | rlen = writev(2, logvec, logvecpos+1); |
|---|
| 112 | |
|---|
| 113 | } |
|---|
| 114 | |
|---|
| 115 | void get_memusage() { |
|---|
| 116 | |
|---|
| 117 | #ifdef UNBIT |
|---|
| 118 | uwsgi.workers[uwsgi.mywid].vsz_size = syscall(356); |
|---|
| 119 | #elif defined(__linux__) |
|---|
| 120 | FILE *procfile; |
|---|
| 121 | int i; |
|---|
| 122 | procfile = fopen("/proc/self/stat", "r"); |
|---|
| 123 | if (procfile) { |
|---|
| 124 | 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); |
|---|
| 125 | if (i != 2) { |
|---|
| 126 | uwsgi_log( "warning: invalid record in /proc/self/stat\n"); |
|---|
| 127 | } |
|---|
| 128 | fclose(procfile); |
|---|
| 129 | } |
|---|
| 130 | uwsgi.workers[uwsgi.mywid].rss_size = uwsgi.workers[uwsgi.mywid].rss_size * uwsgi.page_size; |
|---|
| 131 | #elif defined (__sun__) |
|---|
| 132 | psinfo_t info; |
|---|
| 133 | int procfd ; |
|---|
| 134 | |
|---|
| 135 | procfd = open("/proc/self/psinfo", O_RDONLY); |
|---|
| 136 | if (procfd >= 0) { |
|---|
| 137 | if ( read(procfd, (char *) &info, sizeof(info)) > 0) { |
|---|
| 138 | uwsgi.workers[uwsgi.mywid].rss_size = (uint64_t) info.pr_rssize * 1024 ; |
|---|
| 139 | uwsgi.workers[uwsgi.mywid].vsz_size = (uint64_t) info.pr_size * 1024 ; |
|---|
| 140 | } |
|---|
| 141 | close(procfd); |
|---|
| 142 | } |
|---|
| 143 | |
|---|
| 144 | #elif defined( __APPLE__) |
|---|
| 145 | |
|---|
| 146 | struct task_basic_info t_info; |
|---|
| 147 | mach_msg_type_number_t t_size = sizeof(struct task_basic_info); |
|---|
| 148 | |
|---|
| 149 | if (task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) & t_info, &t_size) == KERN_SUCCESS) { |
|---|
| 150 | uwsgi.workers[uwsgi.mywid].rss_size = t_info.resident_size; |
|---|
| 151 | uwsgi.workers[uwsgi.mywid].vsz_size = t_info.virtual_size; |
|---|
| 152 | } |
|---|
| 153 | #elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__DragonFly__) || defined(__OpenBSD__) |
|---|
| 154 | kvm_t *kv; |
|---|
| 155 | int cnt; |
|---|
| 156 | |
|---|
| 157 | kv = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL); |
|---|
| 158 | if (kv) { |
|---|
| 159 | #if defined(__FreeBSD__) || defined(__DragonFly__) |
|---|
| 160 | |
|---|
| 161 | struct kinfo_proc *kproc; |
|---|
| 162 | kproc = kvm_getprocs(kv, KERN_PROC_PID, uwsgi.mypid, &cnt); |
|---|
| 163 | if (kproc && cnt > 0) { |
|---|
| 164 | uwsgi.workers[uwsgi.mywid].vsz_size = kproc->ki_size; |
|---|
| 165 | uwsgi.workers[uwsgi.mywid].rss_size = kproc->ki_rssize * uwsgi.page_size; |
|---|
| 166 | } |
|---|
| 167 | #elif defined(__NetBSD__) || defined(__OpenBSD__) |
|---|
| 168 | struct kinfo_proc2 *kproc2; |
|---|
| 169 | |
|---|
| 170 | kproc2 = kvm_getproc2(kv, KERN_PROC_PID, uwsgi.mypid, sizeof(struct kinfo_proc2), &cnt); |
|---|
| 171 | if (kproc2 && cnt > 0) { |
|---|
| 172 | #ifdef __OpenBSD__ |
|---|
| 173 | uwsgi.workers[uwsgi.mywid].vsz_size = (kproc2->p_vm_dsize + kproc2->p_vm_ssize + kproc2->p_vm_tsize) * uwsgi.page_size; |
|---|
| 174 | #else |
|---|
| 175 | uwsgi.workers[uwsgi.mywid].vsz_size = kproc2->p_vm_msize * uwsgi.page_size; |
|---|
| 176 | #endif |
|---|
| 177 | uwsgi.workers[uwsgi.mywid].rss_size = kproc2->p_vm_rssize * uwsgi.page_size; |
|---|
| 178 | } |
|---|
| 179 | #endif |
|---|
| 180 | |
|---|
| 181 | kvm_close(kv); |
|---|
| 182 | } |
|---|
| 183 | |
|---|
| 184 | #endif |
|---|
| 185 | } |
|---|