Hi,
i just found this document and i think EVERY admin should know about it.
i followed this tutorial - and my servers ping decreased about 10ms -
gameplay is the best i ever played on any server - no lags and very very
smooth gameplay...
i also tested the kernel patch thing - but with the patched kernel the
hltv proxy (3.1.1.1c1) did no more start ;)
anyway i switched back to hl 3.1.1.0...

here is the article:

Zibbo explains HL server and latencies
Date: Söndag, maj 25 @ 14:29:30
Topic Gaming




There seems to be a lot of confusion about latency issues in a HL
server. What exactly those pingboost options do, and when and why to
use them. I'm the author of the original UDP Soft pingbooster, so I
know a thing or two about this issue. I'm sure I will be repeating a
lot of info for many of you, but I decided to write it all down once
and for all. All of the recommendations I give here are of course just
my opinions, but I like to think myself as being well informed
about these things.
First, what is wrong with a normal way a Half-Life server does things.

HL server normally tries to work like this:

sleep for 1ms
while (it's not yet time for the next frame)
sleep for 1ms
receive and handle all incoming packets
send updates to clients if updaterate and rate settings allow it
repeat forever

So basically a HL server always sleeps at least 1ms between every frame,
and more if enough time has not passed (determined by sys_ticrate)
since starting of the previous frame. This is supposed to keep a
server frame rate exactly at sys_ticrate. The problem with this approach
is the fact that you can't sleep for a 1ms in a normal Linux system.
Trying to sleep for any amount of time takes at least 10ms or more. This
is due to a scheduling frequency of the Linux kernel, which is normally
100Hz (for a slightly longer explanation check out the manual page of
the nanosleep).

So the way a HL server actually works, looks something like this:

sleep for 10-20ms
while (it's not yet time for the next frame)
sleep for 10-20ms
receive and handle all incoming packets
send updates to clients if updaterate and rate settings allow it
repeat forever

This causes some serious latency, because a hl server is sleeping, while
incoming packets from clients are stacking up and waiting to be
handled. With this system, it's basically impossible to get more than
50fps out of a HL server, no matter how fast hardware you have running
it.

Now, what my pingbooster software, and all those -pingboost options
do, is try to change the way the server behaves between frames, when
it normally tries to do that "1ms sleep loop".

I thought that if the server has some work to be done (incoming
packets from clients), it should immediately start doing that work,
and not sleep. So in my pingbooster I replaced the sleep call the HL
server was using with a select call, which listens the network
connection, and waits until there is incoming packets. I also set
sys_ticrate to some crazy number like 10000, so a HL server would
always think that it's time for the next frame. I also set
sv_maxupdaterate to 100 from 60, because I like getting fresh updates
for every frame in my client :)

So a HL server loop was changed to:

wait until there is incoming packets from clients
receive and handle all incoming packets
send updates to clients if updaterate and rate settings allow it
repeat forever

This turned out to be very effective in reducing internal latencies in
a HL server. And replacing the sleep call with waiting for client
packets is also exactly what -pingboost 3 option does. So if anyone is
still using my pingbooster, you can get the same performance by using
-pingboost 3, and setting sys_ticrate to some extremely high number
(like 10000), and sv_maxupdaterate to 100. With that kind of settings,
your server never waits when it has some work to do. So if you get a
99% cpu usage, it just means there is something to do all the time,
and the server is as responsive as it can be with your hardware.

I haven't checked lately what pingboost 1 and 2 options do, but at
least a few months ago they just used different system calls to try to
sleep that 1ms (and failing IIRC), and I wouldn't recommend using those
options. Correct me if I'm wrong.

There is also a way to "fix" Linux to work better with a default HL
server configuration. You can increase the scheduling frequency of
the Linux kernel by editing a file in the Linux kernel source, and
recompiling it. The file is include/asm-i386/param.h, and you have to
change the line "#define HZ 100" to "#define HZ 1000". I've been told
that this is actually a default in 2.5 series of kernels. This should
cause a HL server to behave more or less exactly as it was originally
designed. However, I personally happen to disagree with that design,
and recommend using -pingboost 3 option regardless :) At least with "one
server/cpu" systems.

When you want to run a quality server (and when I say a quality server,
I don't mean a kind of crap that 99% of the hl servers out there are),
number one priority for you should be getting it running at over
100fps consistently. No one cares if it runs 400fps, when there is no
activity, and everyone is camping. It has to stay over 100fps when all
shit hits the fan. When it really matters. Client input should be
handled as quickly as possible, and the only way to do that is having
a high frame rate on the server.

Almost all of the cpu time HL server uses is caused by handling of
incoming packets, and generating updates for clients. So a lot depends
on what kind of settings your clients are using.

If all your players are just average newbies with default
cl_updaterate 20 and cl_cmdrate 30, you can get away with a fairly
large number of maxclients on a relatively slow hardware. And they are
not likely to recognize a good server if it bit them in the ass anyway
:) On the other hand, if you have mostly more experienced players with
fat pipes, and using settings like cl_updaterate 101 and cl_cmdrate
101, you have to have a significantly more powerful server to have it
running at 100fps.

Tips for increasing your server performance:
1. Use -pingboost 3 +sys_ticrate 10000 +sv_maxupdaterate 100
2. If you have more than 1 server/cpu, drop all except 1.
3. Decrease maxclients
4. Decrease amount of metamod mods, or remove metamod completely. They
truly use up incredible amounts of cpu if you consider how little
processing power all the features in those mods should require. Someone
should really look into this..
5. Decrease sv_maxupdaterate.

For reference on what kind of a hardware you might need, I've been
testing with a 1ghz amd processor, and without metamod I can run a 14
player server (with clients with fast connections) without any
significant slowdown. With a metamod+some small mods that number goes
down to about 10.


Almost all of the information I have about the internal workings of a
HL server, I got from using a very simple debugging utility called
strace, and I recommend anyone with any interest in learning more
about what makes these programs tick, to check it out.

For example, performance differences between 3.1.1.0 and 3.1.1.1
versions are clearly visible by comparing strace outputs of different
versions. It seems that in 3.1.1.1 version, generating an update for a
client can take up to 3 times longer than it does in 3.1.1.0 version,
and that's what causing it to perform so badly.

Also, I would recommend Valve to test using sched_yield() call instead
of usleep(), for purposes of releasing a cpu for other applications.

- Zibbo



This article comes from clanding.org | Home of clan [DING]
http://www.clanding.org/

The URL for this story is:
http://www.clanding.org/modules.php?op=modload&name=News&file=article&si
d=6

_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please visit:
http://list.valvesoftware.com/mailman/listinfo/hlds_linux

Reply via email to