[crossfire] multithread vs multi process
Mark Wedel
mwedel at sonic.net
Wed Nov 26 23:22:41 CST 2008
Changing the subject to more accurately note the discussion..
I think there are pros & cons to each approach. And in fact, the end result
may be a mix. Clearly, good design, looking at pros & cons, and what would
actually be used is needed.
Off the top of my head, these are so pros/cons to each method. I'm sure this
isn't a complete list. From what I know of the code (which I know pretty good)
I personally think multithreading would be easier to do than multiprocess.
Multiple processes pros:
- Each map being its own process provides crash resistance - if one map/process
crashes, everyone else keeps on playing.
- Allows for distributed servers (having a cluster of boxes each running some
processes). I do wonder how many folks would really use this however. One use
for this could be for experimental/custom maps (connect to someones test server
that has a new area, etc).
- Don't have to deal with thread locking.
- Because of no locking, each individual process may scale better on mulitple
cores (no thread contention)
Multiple process cons:
- Extra overhead of IPC between processes is needed - not just to move objects,
but also messages, like shouts, etc. This also means writing new code that
doesn't currently exist.
- May still need some locking for common files (basically anything stored in the
var directory, like highscores, banking, etc)
- Would need client (and protocol) updates in addition to server updates.
- Can not run as many processes as threads - larger memory footprint for each
process (vs thread) so would still need each of these processes to handle
multiple maps.
- Have potential issue of data consistency - if as suggested in Ryo's message
that run time loading of new archetypes/other data is added, keep all processes
in sync could be tricky.
Multiple process mixed (has both pros & cons):
- Need a proxy process to handle communication between client and these
processes. Client can keep client access even if a process dies. However, this
proxy is a new set of code, and if it does die, all clients lose their connection.
Multiple thread pros:
- Less code changes - other than creation and deletion of threads, only changes
really needed is addition of locks - no new IPC code, client updates, etc.
- Much more memory friendly - running 1 thread per map, even if that is 1000
threads, is completely doable.
- One could even do multiple threads per map, for example a thread run every 60
seconds that does a backup of the map/player/etc.
- Multiple threads still fix problem of meteor shower or other slowdowns - would
be limited to that one thread (and thus map) and not hit everyone.
- Since all threads share same address space, updates to
archetypes/images/whatever while running would just work.
Multiple thread cons:
- Still limited to a single server - can't run distributed.
- If one thread crashes, all threads crash.
- Can be harder to debug problems (missing locks could lead to odd state of
variables which is hard to pinpoint cause of)
Multiple thread other notes:
- Even with multiple threads, one could have a very simple proxy process, so
that if the server does die, that proxy is still running and can re-connect
clients to server when it is up again.
More information about the crossfire
mailing list