mirror of
https://github.com/clearlinux/uwsgi.git
synced 2026-10-16 17:40:47 +00:00
71 lines
2.0 KiB
C
71 lines
2.0 KiB
C
#include "../../uwsgi.h"
|
|
|
|
/*
|
|
|
|
This plugins is meant as an example for custom implementations.
|
|
|
|
-- Copy of Cheaper, backlog algorithm (supported only on Linux) --
|
|
|
|
increse the number of workers when the listen queue is higher than uwsgi.cheaper_overload.
|
|
Decrese when lower.
|
|
|
|
*/
|
|
|
|
extern struct uwsgi_server uwsgi;
|
|
|
|
int cheaper_backlog2_algo(void) {
|
|
|
|
int i;
|
|
#ifdef __linux__
|
|
int backlog = uwsgi.shared->options[UWSGI_OPTION_BACKLOG_STATUS];
|
|
#else
|
|
int backlog = 0;
|
|
#endif
|
|
|
|
if (backlog > (int)uwsgi.cheaper_overload) {
|
|
// activate the first available worker (taking step into account)
|
|
int decheaped = 0;
|
|
// search for cheaped workers
|
|
for (i = 1; i <= uwsgi.numproc; i++) {
|
|
if (uwsgi.workers[i].cheaped == 1 && uwsgi.workers[i].pid == 0) {
|
|
decheaped++;
|
|
if (decheaped >= uwsgi.cheaper_step)
|
|
break;
|
|
}
|
|
}
|
|
// return the maximum number of workers to spawn
|
|
return decheaped;
|
|
|
|
}
|
|
else if (backlog < (int) uwsgi.cheaper_overload) {
|
|
// count active workers
|
|
int active_workers = 0;
|
|
for (i = 1; i <= uwsgi.numproc; i++) {
|
|
if (uwsgi.workers[i].cheaped == 0 && uwsgi.workers[i].pid > 0) {
|
|
active_workers++;
|
|
}
|
|
}
|
|
|
|
// cheap a worker if too much are running
|
|
if (active_workers > uwsgi.cheaper_count) {
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
// registration hook
|
|
void uwsgi_cheaper_register_backlog2(void) {
|
|
uwsgi_register_cheaper_algo("backlog2", cheaper_backlog2_algo);
|
|
}
|
|
|
|
struct uwsgi_plugin cheaper_backlog2_plugin = {
|
|
|
|
.name = "cheaper_backlog2",
|
|
.on_load = uwsgi_cheaper_register_backlog2,
|
|
|
|
};
|