6 ms·
And strangely enough, people still reinvent the wheel, reproducing a scheduler in userland, which is both insane in term of code complexity and debuggability, a
by xroche 9y ago
And strangely enough, people still reinvent the wheel, reproducing a scheduler in userland, which is both insane in term of code complexity and debuggability, and in term of performances.
- dboreham 9y agoYes, although to be fair they tend to do that because kernel threading never quite does what it needs to do (e.g. doesn't scale to the # threads applications need these days). Your comment is spot on though: I'm only aware of two modern implementations that really work : Erlang and Go.
- kuschku 9y agoAnd the go implementation is also significantly broken, as evidenced by the namespace issue a while ago. https://news.ycombinator.com/item?id=14470231 https://news.ycombinator.com/item?id=14470231
- pcwalton 9y agoKernel threading does scale to the number of threads applications need these days. What can be slow are context switches, but they aren't slow in absolute terms. The vast majority of applications, including Web servers, are perfectly fine with 1:1 threading.
- dozzie 9y agoIt doesn't really scale. Kernel level threads are quite expensive in the terms of memory. Erlang's processes take up few hundred bytes. It's rare to have dozen thousands of kernel-level threads running on Linux, while it's quite common for Erlang servers to have that many processes.
- api 9y agoAnyone know if this is better in Alpine Linux with musl libc and smaller stacks?
- dozzie 9y agoIt's not really up to a distribution to lessen this cost. Large part of it is what task descriptor in the kernel takes. Also, if nothing else, you'll run out of PID numbers, as they're usually still 16 bits, even today, though there was a kernel compilation option to change that, from what I remember.
- bluetech 9y agoIt can be changed at runtime. From proc(5), system wide limits: /proc/sys/kernel/pid_max > PID_MAX_LIMIT, approximately 4 million /proc/sys/kernel/threads-max > FUTEX_TID_MASK (0x3fffffff), [approximately 1 billion] For per-process limit, increase RLIMIT_NPROC.
- pcwalton 9y ago> Large part of it is what task descriptor in the kernel takes. 4K for kernel stacks, only 2K with future work. That's really not much space at all if you're doing anything interesting with those threads. > Also, if nothing else, you'll run out of PID numbers, as they're usually still 16 bits, even today Not for a very long time.
- pgwhalen 9y agoI wrote a server application that runs with about a million goroutines and performs quite well. It's not a webserver, but it responds to "requests" within hundreds of micros. Surely this would not be possible with OS threads.
- deleted 9y ago[deleted]
- xroche 9y agoThreads do scale. On Linux, O(1) scheduler solved this non-issue a long time ago.
- signa11 9y ago> Threads do scale. On Linux, O(1) scheduler solved this non-issue a long time ago. yup they do. till you start making sure that your code doesn't end up with deadlock, data-corruption, races, performance issues due to lock-contention etc. etc. designing efficient locking schemes is notoriously hard alternating between: - too coarse grained : resulting in serializing activities which could have (should have) proceeded in parallel, thereby sacrificing performance and scalability. or - too fine grained: with space+time for lock operations sapping performance, error recovery and not to mention understanding etc. etc. In the former we have the dragons of deadlock and livelock roaming freely, and in the latter we have race conditions. Somewhere in between is a razor's edge which is both efficient and correct. Almost always, things start with ‘one big lock around everything’ and the vague hope that performance might not be abysmal. When that is dashed, big lock gets broken up, and the prayer is repeated. Each iteration increasing complexity and decreasing lock-contention, and hopefully with some luck, modest performance gain as well. remember this: What do we want ? Now ! When do we want it ? Fewer race conditions ! have fun :)
- throwme211345 9y agoI see your design is lacking and your fud quotient is high. Good on you!
- cheez 9y agoYep. This was my reaction as well. Threads are fine.
- morecoffee 9y agoHaving high numbers threads and switching between threads are different things. There is still a huge constant in front of that O(1) scheduler that makes it unattractive.
- edem 9y agoThen look at what Clojure is capable of.
- api 9y agoKernel threading doesn't scale well beyond hundreds or maybe thousands of threads. A server can have a million concurrent requests in progress. Of course a better solution would have been to fix the kernel rather than go back to 1980s cooperative multitasking in userland.