RFC: KIO::Scheduler changes... [PATCH included]

Dawit A. adawit at kde.org
Fri Aug 28 22:25:54 BST 2009


This is a follow up on the the recent discussions about what KIO::Scheduler 
does by default and how we can go about improving the current default behavior 
to resolve some long standing issues in KDE as well as limit the number new 
ioslaves (read: new connections) that get spawned. For further details please 
read the the threads linked below or the explanation at the bottom of this 
email.

The patches provided here are my attempt to address the current short comings 
of the scheduler and are based on a patch David posted in [1] with the 
following additions/modifications:

1.) Add support for optional host based limits to the .protocol files 
(maxInstancesPerHost) and if set use them in KIO::Scheduler::scheduleJob.

2.) Modify the job.cpp class to ensure all redirected requests are re-
scheduled.

3.) Remove scheduled jobs if they are to be used in connection-oriented 
scheduling mode, KIO::Scheduler::assignJobToSlave.

---------------------------------------------------------------------------------------------------------------------------------------------

What follows is a brief explanation of how jobs are currently handled by the 
scheduler and how they will be handled when the attached patches are applied 
for those that do not want to be bothered to read the other threads linked 
below. 

First, for the benefit of those not familiar with the inner workings of KIO, 
here is roughly how a job is handled by KIO internally:

1.) A call to KIO::get, KIO::post, KIO::mimetype comes in...

2.) A job is created and of it is of type SimpleJob, it is handed over to 
KIO::Scheduler...

3.) KIO::Scheduler simply checks to see if there is an idle ioslave that can 
be reused to handle the request. If one is found, it is reused.

4.) If none was found, the scheduler will always attempt to create a brand new 
ioslave. No limits on the number of ioslaves it will create.

The issue with this is that the scheduler by default does not have any limits 
on the number ioslaves (read: new connections) that it spawns. Instead it 
forces you to call an additional function, KIO::Scheduler::scheduleJob, if you 
want to limit the number ioslave instances. 

In practise the problems with this default behavior only affects users under 
certain circumstances where servers actually put a limit on the number of 
connections they allow from a given address. This is specially true for more 
than a few ftp servers out there. In fact, there is a long standing FTP 
related bug vs Konqueror caused by this very issue. However, just because 
users do not directly see the side effects does not mean there is no problem 
with what the scheduler does by default. Creating too many connections by 
spawning many ioslaves is a costly affair to both to the client and server 
machines since it will unnecessarily result in the creation of many sockets. 
Hence, we end up using too many resources.

Okay so what does this attach patch do ?

1.) Schedule all simple jobs created through KIO::<get/post/..> by default.

2.) Add an optional "maxInstancesPerHost" property to the *.protocol files that 
is honored when jobs are scheduled which is now the default. KIO::scheduleJob 
currently honors the existing "maxInstances" property set in each *.protocol 
file as a 'soft limit'. However, if #1 is made the default, then this will 
cause a bottle neck at the scheduler since the "maxInstances" property is per 
protocol (ftp, http). For example, for the ioslaves included in kdelibs, these 
value is set to 4, 3, and 2 in file, http and ftp protocol files respectively. 
Having only this many instances of ioslaves KDE wide is not sufficient. Hence 
the new property. After that it is only a matter of setting both 
"maxInstances=" and "maxInstancesPerHost=" proerties to some sane default 
values so that the scheduler can do a better job of scheduling requests per 
host. 

For example, fot the http protocol the "maxInstances" property can be raised 
to "15", 5x as much as its original value, and "maxInstancesPerHost" set to 
"3". This means that there cannot be more than 15 instances of the http 
ioslave at any given time and no more than 3 connection to any given host. All 
jobs will be queued until this criteria is fulfilled...

What issues remain ?

1.) Unfortunately the patch to job.cpp will break applications that might want 
to have direct control over the number of ioslaves (read: connections) , e.g. 
a download manager. The change to scheduling jobs by default will make direct 
control impossible since all jobs will be queued. So, an additional function 
is required in KIO::Scheduler to remove the scheduled job from the queue or 
such applications need to call KIO::Scheduler::doJob again and we can add the 
remove from queue check there ??? Somehow the last one seems very inefficient to 
me, doJob(...), scheduleJob(...) and then doJob(...) again...

2.) Should the other scheduling modes, besides "scheduled mode" be forced to 
honor the "maxInstances" property ? My own view is no since the default does 
and the other modes are meant to give the users of KIO complete control to 
schedule their jobs how they see fit.

Anyhow, comments, suggestions, improvements and everything in between is 
welcome...

[1] http://lists.kde.org/?t=124531188100002&r=1&w=2
[2] http://lists.kde.org/?t=125042610900001&r=1&w=2
-------------- next part --------------
A non-text attachment was scrubbed...
Name: scheduler.patch
Type: text/x-patch
Size: 5584 bytes
Desc: not available
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20090828/db6e6b02/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: job.patch
Type: text/x-patch
Size: 1290 bytes
Desc: not available
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20090828/db6e6b02/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: kprotocolinfo.patch
Type: text/x-patch
Size: 3166 bytes
Desc: not available
URL: <http://mail.kde.org/pipermail/kde-core-devel/attachments/20090828/db6e6b02/attachment-0002.bin>


More information about the kde-core-devel mailing list