吐槽先,對於uWSGI狀態信息沒有文檔說明這樣一個現實,我只想說一句:F*CK YOU!!!python
花了2天時間,累得眼珠子疼,針對這鬼畜的stats,藉助Total Commander和VS大概擼了一邊uWSGI的源碼。還好C寫的,不難。但是,尼瑪一個文件幾千行代碼啊有木有有木有!!!!!FUCK YOU!!!處處return啊有木有!!!json
好了心情好多了,;)app
博客園代碼格式裏面沒有json,嗶...Python代替dom
Eclipse有個json插件,看起來可能會舒服一些socket
{ "version":"2.0.7", "listen_queue":101, //the maximum value of queues in sockets master.c void master_check_listen_queue() "listen_queue_errors":0, //unused master_utils.c uwsgi_stats_keylong_comma(us, "listen_queue_errors", (unsigned long long) uwsgi.shared->backlog_errors) "signal_queue":0, //length of master(worker0)'s signal queue "load":101, //same as listen_queue master.c void master_check_listen_queue() "pid":13755, //PID of master process "uid":500, "gid":500, "cwd":"/home/robert", "locks":[ { "user 0":0 //uwsgi.lock(locknum=0) internal pointer lock.c void uwsgi_setup_locking() uwsgi_pymodule.c PyObject *py_uwsgi_lock(PyObject * self, PyObject * args) uwsgi.c }, { "signal":0 //internal pointer lock.c void uwsgi_setup_locking() }, { "filemon":0 //internal pointer lock.c void uwsgi_setup_locking() }, { "timer":0 //internal pointer lock.c void uwsgi_setup_locking() }, { "rbtimer":0 //internal pointer lock.c void uwsgi_setup_locking() }, { "cron":0 //internal pointer lock.c void uwsgi_setup_locking() }, { "rpc":0 //internal pointer lock.c void uwsgi_setup_locking() }, { "snmp":0 //internal pointer uwsgi.c int uwsgi_start(void *v_argv) } ], "sockets":[ { "name":":8080", "proto":"http", "queue":96, "max_queue":100, "shared":0, //If value was equal to 1,it's shared socket. core/uwsgi.c void uwsgi_opt_add_shared_socket(char *opt, char *value, void *protocol) {"shared-socket", required_argument, 0, "create a shared socket for advanced jailing or ipc", uwsgi_opt_add_shared_socket, NULL, 0} "can_offload":0 //If value was equal to 1,there're some offload threads. core/uwsgi.c uwsgi.offload_threads master_utils.c uwsgi_sock->can_offload }, { "name":":8181", "proto":"http", "queue":101, "max_queue":100, "shared":0, "can_offload":0 } ], "workers":[ { "id":1, "pid":13756, "accepting":1, //mark the worker as "accepting" (this is a mark used by chain reloading) core/uwsgi.c "requests":1314, //number of closed resuests,summation of cores utils.c void uwsgi_close_request(struct wsgi_request *wsgi_req) "delta_requests":1314, //this is used for MAX_REQUESTS.if this worker been killed, this value will be reset {"max-requests", required_argument, 'R', "reload workers after the specified amount of managed requests", uwsgi_opt_set_64bit, &uwsgi.max_requests, 0} "exceptions":7, //summation of core's exceptions master_utils.c uint64_t uwsgi_worker_exceptions(int wid) "harakiri_count":0, //harakiri count master_utils.c void trigger_harakiri(int i) master.c uwsgi_master_check_workers_deadline() "signals":0, //number of signals receive uwsgi.register_signal(num, who, function) signal.c int uwsgi_signal_handler(uint8_t sig) "signal_queue":0, //length of signal queue "status":"busy", //"cheap" "pause" "sigxx" "busy" "idle" master_utils.c struct uwsgi_stats *uwsgi_master_generate_stats() "rss":10108928, //in bytes "vsz":176484352, //in bytes "running_time":155985031, //in microseconds utils.c void uwsgi_close_request(struct wsgi_request *wsgi_req) "last_spawn":1412754993, //spawned time in seconds since 1970-1-1 00:00:00 core/uwsgi.c uwsgi_start(void *v_argv) "respawn_count":1, "tx":3597862127, //in bytes "avg_rt":125073, //average response time in microseconds utils.c uwsgi.workers[uwsgi.mywid].avg_response_time = (uwsgi.workers[uwsgi.mywid].avg_response_time + tmp_rt) / 2; "apps":[ { "id":0, "modifier1":0, //utils.c struct uwsgi_app *uwsgi_add_app(int id, uint8_t modifier1, char *mountpoint, int mountpoint_len, void *interpreter, void *callable) "mountpoint":"", //utils.c struct uwsgi_app *uwsgi_add_app(int id, uint8_t modifier1, char *mountpoint, int mountpoint_len, void *interpreter, void *callable) "startup_time":0, //total time in seconds during startup pyloader.c wi->startup_time = uwsgi_now() - now; uwsgi_log( "WSGI app %d (mountpoint='%.*s') ready in %d seconds on interpreter %p pid: %d%s\n", id, wi->mountpoint_len, wi->mountpoint, (int) wi->startup_time, wi->interpreter, (int) getpid(), default_app); "requests":1315, //python/wsgi_handlers.c int uwsgi_request_wsgi(struct wsgi_request *wsgi_req) "exceptions":7, "chdir":"" //change work directory } ], "cores":[ { "id":0, "requests":1314, //utils.c uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].requests++; "static_requests":0, //static file serving mode static.c int uwsgi_file_serve(...) uwsgi_real_file_serve(struct wsgi_request *wsgi_req, char *real_filename, size_t real_filename_len, struct stat *st) "routed_requests":0, //route mode routing.c int uwsgi_apply_routes_do(struct uwsgi_route *routes, struct wsgi_request *wsgi_req, char *subject, uint16_t subject_len) "offloaded_requests":0, //offload.c int uwsgi_offload_enqueue(struct wsgi_request *wsgi_req, struct uwsgi_offload_request *uor) "write_errors":14, "read_errors":0, "in_request":1, //if 1,dealing with request,else 0 utils.c void uwsgi_close_request(struct wsgi_request *wsgi_req) int wsgi_req_async_recv(struct wsgi_request *wsgi_req) "vars":["REQUEST_METHOD=GET","REQUEST_URI=/","PATH_INFO=/","QUERY_STRING=","SERVER_PROTOCOL=HTTP/1.1","SCRIPT_NAME=","SERVER_NAME=localhost.localdomain","SERVER_PORT=8080","REMOTE_ADDR=10.30.178.33","HTTP_ACCEPT_ENCODING=identity","HTTP_HOST=10.30.178.174:8080","HTTP_CONNECTION=close","HTTP_USER_AGENT=Python-urllib/2.7","" ] } ] }, { "id":2, "pid":13757, "accepting":1, "requests":1495, "delta_requests":1495, "exceptions":34, "harakiri_count":0, "signals":0, "signal_queue":0, "status":"busy", "rss":10104832, "vsz":176484352, "running_time":156051340, "last_spawn":1412754993, "respawn_count":1, "tx":3548600500, "avg_rt":19505, "apps":[ { "id":0, "modifier1":0, "mountpoint":"", "startup_time":0, "requests":1496, "exceptions":34, "chdir":"" } ], "cores":[ { "id":0, "requests":1495, "static_requests":0, "routed_requests":0, "offloaded_requests":0, "write_errors":62, "read_errors":0, "in_request":1, "vars":["REQUEST_METHOD=GET","REQUEST_URI=/","PATH_INFO=/","QUERY_STRING=","SERVER_PROTOCOL=HTTP/1.1","SCRIPT_NAME=","SERVER_NAME=localhost.localdomain","SERVER_PORT=8080","REMOTE_ADDR=10.30.178.33","HTTP_ACCEPT_ENCODING=identity","HTTP_HOST=10.30.178.174:8080","HTTP_CONNECTION=close","HTTP_USER_AGENT=Python-urllib/2.7","" ] } ] }, { "id":3, "pid":13758, "accepting":1, "requests":1284, "delta_requests":1284, "exceptions":7, "harakiri_count":0, "signals":0, "signal_queue":0, "status":"busy", "rss":10104832, "vsz":176484352, "running_time":156205643, "last_spawn":1412754993, "respawn_count":1, "tx":3636193672, "avg_rt":2959, "apps":[ { "id":0, "modifier1":0, "mountpoint":"", "startup_time":0, "requests":1285, "exceptions":7, "chdir":"" } ], "cores":[ { "id":0, "requests":1284, "static_requests":0, "routed_requests":0, "offloaded_requests":0, "write_errors":12, "read_errors":0, "in_request":1, "vars":["REQUEST_METHOD=GET","REQUEST_URI=/","PATH_INFO=/","QUERY_STRING=","SERVER_PROTOCOL=HTTP/1.1","SCRIPT_NAME=","SERVER_NAME=localhost.localdomain","SERVER_PORT=8080","REMOTE_ADDR=10.30.178.33","HTTP_ACCEPT_ENCODING=identity","HTTP_HOST=10.30.178.174:8080","HTTP_CONNECTION=close","HTTP_USER_AGENT=Python-urllib/2.7","" ] } ] }, { "id":4, "pid":13759, "accepting":1, "requests":1332, "delta_requests":1332, "exceptions":10, "harakiri_count":0, "signals":0, "signal_queue":0, "status":"busy", "rss":10108928, "vsz":176484352, "running_time":151715232, "last_spawn":1412754993, "respawn_count":1, "tx":3439073176, "avg_rt":19619, "apps":[ { "id":0, "modifier1":0, "mountpoint":"", "startup_time":0, "requests":1333, "exceptions":10, "chdir":"" } ], "cores":[ { "id":0, "requests":1332, "static_requests":0, "routed_requests":0, "offloaded_requests":0, "write_errors":15, "read_errors":0, "in_request":1, "vars":["REQUEST_METHOD=GET","REQUEST_URI=/","PATH_INFO=/","QUERY_STRING=","SERVER_PROTOCOL=HTTP/1.1","SCRIPT_NAME=","SERVER_NAME=localhost.localdomain","SERVER_PORT=8080","REMOTE_ADDR=10.30.178.33","HTTP_ACCEPT_ENCODING=identity","HTTP_HOST=10.30.178.174:8080","HTTP_CONNECTION=close","HTTP_USER_AGENT=Python-urllib/2.7","" ] } ] } ]}