From 8bfb6b40d75b67e3b5a471869dc86cc02fb0fb86 Mon Sep 17 00:00:00 2001
From: Vladislav Bolkhovitin
Date: Thu, 7 Jul 2011 19:52:17 +0000
Subject: [PATCH] Web updates
git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@3660 d57e44dd-8a1f-0410-8b47-8ef2f437770f
---
www/contributing.html | 150 ------------------------------------------
1 file changed, 150 deletions(-)
diff --git a/www/contributing.html b/www/contributing.html
index 56422fd87..83aad1f83 100644
--- a/www/contributing.html
+++ b/www/contributing.html
@@ -93,156 +93,6 @@
page cache, namely, locking issues related to it. They should be carefully
investigated.
- Dynamic I/O flow control
-
- At the moment, if an initiator or several initiators simultaneously send to
- target too many commands, especially in seek intensive workloads, target can get
- overloaded and not able to finish commands on time. In such cases you can see on
- the initiator(s) messages about aborting commands or resetting the target. See in SCST core
- README section "What if target's backstorage is too slow" for more details.
- To fix this problem it is necessary to implement a dynamic I/O flow control in
- SCST core.
-
- The flow control, generally, is quite simple. Each SCST command has timeout value,
- which is set by the corresponding dev handler. SCST core should keep device's queue depth
- at the level that the worst command's execution time, i.e. time between scst_rx_cmd()
- and scst_finish_cmd(), would be between something like timeout/10 and timeout/5.
- So, commands execution time should be checked and:
-
-
- - If it's > timeout/5, then the new queue depth should be set to max(1,
- cur_depth/2)
-
- - If it's < timeout/10, then new queue depth should be set to min(MAX_DEPTH,
- cur_depth+1). This shouldn't be done too often, once in a few minutes should be
- sufficient
-
-
- The above is, of course, an oversimplification to let you see the idea.
- Implementation considering real life cases should be as the following:
-
- 1. There are several parameters:
-
-
- - P - load watch period. During this period all the statistic is
- gathered and processed.
-
- - MN - underload ratio divisor, which sets the underload portion of
- timeout. If the longest execution time among all commands completed
- during period P is below timeout/MN, the corresponding device considered
- underloaded.
-
- - MX - overload ratio divisor, which sets the overload portion of
- timeout. If the longest execution time among all commands completed
- during period P is above timeout/MX, the corresponding device considered
- overloaded.
-
- - I - step on which device's queue size will be increased if device
- considered underloaded.
-
- - D - divisor on which device's queue size will be decreased if device
- considered overloaded.
-
- - QI - quick fall interval. See description of Q parameter.
-
- - Q - quick fall ratio divisor. If the longest execution time of a
- completed command is above timeout/Q and time from the previous quick
- fall is smaller than QI, the corresponding device considered heavily
- overloaded. The quick fall is needed to handle cases when load on device
- is instantly increased on the way, where it can't handle it properly.
-
- - QD - divisor on which device's queue size will be decreased if
- device considered heavily overloaded.
-
-
- The default values should be something like: P=15 sec., MN=20, MX=10, Q=3,
- I=1, D=2, QI=5 sec., QD=10.
-
- 2. There are the following new variables in struct scst_device:
-
-
- - queue_depth - current queue depth.
-
- - max_exec_ratio - maximum commands timeout/(execution time).
-
- - queue_was_full - flag, marking that the queue was at least once full
- during period P.
-
- - quick_fall_time - time of the last quick fall.
-
- - flow_lock - protects flow control related variables, where needed.
-
- - ...
-
-
- 3. The commands processing path should be as the following:
-
-
- - In scst_rx_cmd() the start time of the command is recorded (already done).
-
- - In __scst_init_cmd(), if dev->dev_cmd_count == dev->queue_depth,
- dev->queue_was_full set to true.
-
- - In scst_finish_cmd() dev->max_exec_ratio set to max(dev->max_exec_ratio,
- (cmd's exec_time)*100/cmd->timeout).
-
- - If in scst_finish_cmd() cmd's exec time is above cmd->timeout/Q and
- time from the latest quick fall is above QI, then:
-
-
- - dev->queue_depth set to max(1, dev->queue_depth/QD).
-
- - Flow control period reset, i.e. started again, including setting
- dev->max_exec_ratio to 0 and dev->quick_fall_time to jiffies.
-
-
-
-
- 4. There should be a work, which once in a P seconds will check
- dev->max_exec_ratio, then:
-
-
- - If device neither underloaded, nor overloaded. i.e. max_exec_ratio
- between defined by MN and MX, do nothing.
-
- - If device was underloaded:
-
-
- - if dev->queue_was_full is false, then do nothing.
-
- - if dev->queue_was_full is true, then set dev->queue_depth to
- min(SCST_MAX_DEV_COMMANDS, dev->queue_depth + I).
-
-
-
- - If device was overloaded, then set dev->queue_depth to max(1,
- dev->queue_depth/D).
-
-
- Then the flow control period is reset, i.e. started again, including
- setting dev->max_exec_ratio to 0 and dev->quick_fall_time to jiffies.
-
- That's all. Then only support for initiators, like iSCSI,
- which don't handle QUEUE FULL to decrease amount of queued
- commands, should be added. Such initiators expect target to control size of
- the queue, via, e.g., through MAX_SN for iSCSI.
-
- For it at the stage 2 of the dynamic flow control development
- the following should be done:
-
-
- - New callback on_queue_depth_adjustment() should be added to struct
- scst_tgt_template.
-
- - If target driver defined it, each time after dev->queue_depth changed
- on_queue_depth_adjustment() should be called. In this callback target
- driver should change internal queue_depth to, e.g. for iSCSI target, set
- max_sn in the replies correctly.
-
-
- Then, at the latest stage of the development, logic to not schedule the
- flow control work on idle devices should be added.
-
Support for O_DIRECT in scst_vdisk handler
At the moment, scst_vdisk handler doesn't support O_DIRECT option and possibility to set it