diff options
Diffstat (limited to 'xlators/performance/io-threads/src/io-threads.h')
| -rw-r--r-- | xlators/performance/io-threads/src/io-threads.h | 164 |
1 files changed, 55 insertions, 109 deletions
diff --git a/xlators/performance/io-threads/src/io-threads.h b/xlators/performance/io-threads/src/io-threads.h index b6a7213b1..1a9dee9ae 100644 --- a/xlators/performance/io-threads/src/io-threads.h +++ b/xlators/performance/io-threads/src/io-threads.h @@ -1,20 +1,11 @@ /* - Copyright (c) 2006-2009 Z RESEARCH, Inc. <http://www.zresearch.com> - This file is part of GlusterFS. - - GlusterFS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see - <http://www.gnu.org/licenses/>. + Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com> + This file is part of GlusterFS. + + This file is licensed to you under your choice of the GNU Lesser + General Public License, version 3 or any later version (LGPLv3 or + later), or the GNU General Public License, version 2 (GPLv2), in all + cases as published by the Free Software Foundation. */ #ifndef __IOT_H @@ -34,113 +25,68 @@ #include "common-utils.h" #include "list.h" #include <stdlib.h> +#include "locking.h" +#include "iot-mem-types.h" +#include <semaphore.h> +#include "statedump.h" -#define min(a,b) ((a)<(b)?(a):(b)) -#define max(a,b) ((a)>(b)?(a):(b)) struct iot_conf; -struct iot_worker; -struct iot_request; - -struct iot_request { - struct list_head list; /* Attaches this request to the list of - requests. - */ - call_stub_t *stub; -}; - -#define IOT_STATE_ACTIVE 1 -#define IOT_STATE_DEAD 2 -#define iot_worker_active(wrk) ((wrk)->state == IOT_STATE_ACTIVE) -#define MAX_IDLE_SKEW 1000 /* usecs */ -#define skew_usec_idle_time(usec) ((usec) + (random () % MAX_IDLE_SKEW)) -#define IOT_DEFAULT_IDLE 180 /* In secs. */ +#define MAX_IDLE_SKEW 4 /* In secs */ +#define skew_sec_idle_time(sec) ((sec) + (random () % MAX_IDLE_SKEW)) +#define IOT_DEFAULT_IDLE 120 /* In secs. */ -#define IOT_MIN_THREADS 16 -#define IOT_MAX_THREADS 256 +#define IOT_MIN_THREADS 1 +#define IOT_DEFAULT_THREADS 16 +#define IOT_MAX_THREADS 64 -#define IOT_SCALING_OFF _gf_false -#define IOT_SCALING_ON _gf_true -#define iot_ordered_scaling_on(conf) ((conf)->o_scaling == IOT_SCALING_ON) -#define iot_unordered_scaling_on(conf) ((conf)->u_scaling == IOT_SCALING_ON) #define IOT_THREAD_STACK_SIZE ((size_t)(1024*1024)) -struct iot_worker { - struct list_head rqlist; /* List of requests assigned to me. */ - struct iot_conf *conf; - int64_t q,dq; - pthread_cond_t dq_cond; - pthread_mutex_t qlock; - int32_t queue_size; - pthread_t thread; - int state; /* What state is the thread in. */ - int thread_idx; /* Thread's index into the worker array. Since this - will be thread local data, for ensuring that number - of threads dont fall below a minimum, we just dont - allow threads with specific indices to exit. - Helps us in eliminating one place where otherwise - a lock would have been required to update centralized - state inside conf. - */ + +typedef enum { + IOT_PRI_HI = 0, /* low latency */ + IOT_PRI_NORMAL, /* normal */ + IOT_PRI_LO, /* bulk */ + IOT_PRI_LEAST, /* least */ + IOT_PRI_MAX, +} iot_pri_t; + +#define IOT_LEAST_THROTTLE_DELAY 1 /* sample interval in seconds */ +struct iot_least_throttle { + struct timeval sample_time; /* timestamp of current sample */ + uint32_t sample_cnt; /* sample count for active interval */ + uint32_t cached_rate; /* the most recently measured rate */ + int32_t rate_limit; /* user-specified rate limit */ + pthread_mutex_t lock; }; struct iot_conf { - int32_t thread_count; - struct iot_worker ** workers; - - xlator_t *this; - /* Config state for ordered threads. */ - pthread_mutex_t otlock; /* Used to sync any state that needs to be - changed by the ordered threads. - */ - - int max_o_threads; /* Max. number of ordered threads */ - int min_o_threads; /* Min. number of ordered threads. Ordered - thread count never falls below this - threshold. - */ - - int o_idle_time; /* in Secs. The idle time after which an - ordered thread exits. - */ - gf_boolean_t o_scaling; /* Set to IOT_SCALING_OFF if user does not want - thread scaling on ordered threads. - If scaling is off, io-threads maintains - at least min_o_threads number of threads - and never lets any thread exit. - */ - struct iot_worker **oworkers; /* Ordered thread pool. */ - - - /* Config state for unordered threads */ - pthread_mutex_t utlock; /* Used for scaling un-ordered threads. */ - struct iot_worker **uworkers; /* Un-ordered thread pool. */ - int max_u_threads; /* Number of unordered threads will not be - higher than this. - */ - int min_u_threads; /* Number of unordered threads should not - fall below this value. */ - int u_idle_time; /* If an unordered thread does not get a - request for this amount of secs, it should - try to die. - */ - gf_boolean_t u_scaling; /* Set to IOT_SCALING_OFF if user does not want - thread scaling on unordered threads. - If scaling is off, io-threads maintains - at least min_u_threads number of threads - and never lets any thread exit. - */ - - pthread_attr_t w_attr; /* Used to reduce the stack size of the - pthread worker down from the default of - 8MiB. - */ + pthread_mutex_t mutex; + pthread_cond_t cond; + + int32_t max_count; /* configured maximum */ + int32_t curr_count; /* actual number of threads running */ + int32_t sleep_count; + + int32_t idle_time; /* in seconds */ + + struct list_head reqs[IOT_PRI_MAX]; + + int32_t ac_iot_limit[IOT_PRI_MAX]; + int32_t ac_iot_count[IOT_PRI_MAX]; + int queue_sizes[IOT_PRI_MAX]; + int queue_size; + pthread_attr_t w_attr; + gf_boolean_t least_priority; /*Enable/Disable least-priority */ + + xlator_t *this; + size_t stack_size; + + struct iot_least_throttle throttle; }; typedef struct iot_conf iot_conf_t; -typedef struct iot_worker iot_worker_t; -typedef struct iot_request iot_request_t; #endif /* __IOT_H */ |
