LWN: Comments on "Toward a smarter OOM killer" http://lwn.net/Articles/359998/ This is a special feed containing comments posted to the individual LWN article titled "Toward a smarter OOM killer". hourly 2 death by swap http://lwn.net/Articles/365348/rss 2009-12-05T17:19:38+00:00 misiu_mp <div class="FormattedComment"> That was a description of trashing.<br> I would presume that executables do not make up much of the used memory. So reusing their pages will probably not be much gain.<br> <p> Trashing is what happens when processes get their pages continuously swapped in and out as the system schedules them to run. Thats when everything grinds to a halt because each context switch or memory access needs to swap out some memory in order to make place for some other memory to be read in from the swap or the binary.<br> That can possibly happen when the total working set (actively used memory) of the busy processes exceeds the amount of ram, or more realistically, when the swap (nearly) runs out so there is nowhere to evict unused pages to free up ram - leaving space for only small chunks to run at a time.<br> Usually (in my desktop experience) soon after that the oom killer start kicking in, which causes the system to trash even more (as the oom have needs too) and it takes hours for it to be done. <br> When it happens I usually have no choice but to reboot loosing some data, so for me the oom killer has been useless and over-commitment the root of all evil.<br> <p> Using up swap alone does not affect performance much, if you dont access whats on the swap. If you continuously do that - that's trashing. <br> </div> The existence of OOM is one of the few really stupid things in Linux http://lwn.net/Articles/363396/rss 2009-11-23T15:19:36+00:00 jch <div class="FormattedComment"> <font class="QuotedText">&gt; How does Solaris deal with mapping shared libraries without overcommitting?</font><br> <p> Shared libraries are backed by filesystem data, so a read-only map of a shared library does not involve overcommit.<br> <p> </div> posix_spawn is stupid as a system call http://lwn.net/Articles/363393/rss 2009-11-23T15:08:38+00:00 jch <div class="FormattedComment"> This is analogous to the *at system calls (openat, fstatat, ...) that have been introduced in Linux and included in the latest revision of POSIX.<br> <p> </div> death by swap http://lwn.net/Articles/362856/rss 2009-11-19T18:33:28+00:00 dlang <div class="FormattedComment"> I don't understand how that is any different than thrashing the swap.<br> <p> in both cases you have to read from disk to continue, the only difference is if you are reading from the swap space or the initial binary (and since both probably require seeks, it's not even a case of random vs sequential disk access)<br> </div> death by swap http://lwn.net/Articles/362822/rss 2009-11-19T16:46:46+00:00 nye <div class="FormattedComment"> <font class="QuotedText">&gt;my recommendation is that if you are using a normal hard drive (usually including the SSD drives that emulate normal hard drives), allocate a 2G swap partition and leave overcommit enabled (and that's probably a lot larger than you will ever use)</font><br> <p> FWIW, I agree, except that I'd make it a file instead of a partition - it's just as fast, and it leaves some flexibility just in case.<br> <p> I use a 2GB swapfile on machines ranging from 256MB to 8GB of RAM - it may be overkill but that much disk space costs next to nothing. I wouldn't want to set it higher, because if I'm really using swap to that extent, the machine's probably past the point of usability anyway.<br> </div> death by swap http://lwn.net/Articles/362737/rss 2009-11-19T13:29:57+00:00 makomk <div class="FormattedComment"> On the other hand, too small a swap partition can also cause "death by swap". Once the swap partition fills up, the only way to free up memory is to start evicting code from RAM - and that utterly kills the responsiveness of the system, as less and less RAM becomes available for the running apps' code. The system enters a kind of death spiral, where the more memory the application allocates, the more slowly it and every other application runs.<br> </div> death by swap http://lwn.net/Articles/362530/rss 2009-11-18T18:37:30+00:00 dlang <div class="FormattedComment"> there used to be a technical reason for twice ram.<br> <p> nowdays it depends on your system and how you use it.<br> <p> if you use the in-kernel suspend code, the act of suspending will write all your ram into the swap space, so swap must be &gt; ram<br> <p> if you don't use the in-kernel suspend code you need as much swap as you intend to use. How much swap you are willing to use depends very much on your use case. for most people a little bit of swap in use doesn't hurt much to use and by freeing up additional ram results in a overall faster system. for other people the unpredictable delays in applications due to the need to pull things from swap is unacceptable. In any case, having a lot of swap activity if pretty much unacceptable for anyone.<br> <p> <p> note that if you disable overcommit you need more swap or allocations (like when a large program forks) will fail so you need additional swap space &gt; max memory footprint of any process you intend to allow to fork (potentially multiples of this). With overcommit disabled I could see you needing swap significantly higher than 2x ram in some conditions.<br> <p> <p> my recommendation is that if you are using a normal hard drive (usually including the SSD drives that emulate normal hard drives), allocate a 2G swap partition and leave overcommit enabled (and that's probably a lot larger than you will ever use)<br> <p> if you are using a system that doesn't have a normal hard drive (usually this sort of thing has no more than a few gig of flash as it's drive) you probably don't want any swap, and definantly want to leave overcommit on.<br> </div> death by swap http://lwn.net/Articles/362494/rss 2009-11-18T16:47:28+00:00 pimlottc <blockquote>STOP USING the old "TWICE RAM" guideline!</blockquote> You know, I've been hearing this lately, but the problem is there seems to be no consensus on what the guideline should be. Some swear by no swap at all, while others say running without at least some is dangerous. No one seems to agree on what an appropriate amount is. Until there is a new accepted rule of thumb, everyone will keep using the old one, even if it's wrong. death by swap http://lwn.net/Articles/362489/rss 2009-11-18T16:12:34+00:00 pimlottc <div class="FormattedComment"> irssi can't start on a system with 256MB RAM and no swap? Seriously?<br> </div> death by swap http://lwn.net/Articles/362072/rss 2009-11-16T13:50:48+00:00 michaeljt <div class="FormattedComment"> <font class="QuotedText">&gt;&gt; If you get to the point that you're stealing a page from a process simply because that process is over its quota of real memory, you should steal ALL that process' pages. It can't fit its working set into memory, so it isn't going to make decent progress, so the memory you do give it is wasted.</font><br> <font class="QuotedText">&gt;I suppose I see three cases here. One is that the page was part of the process' working set at an earlier point in time, but no longer is. In that case swapping it out is the right thing to do. The other is that the process is in control, but it's working set is bigger than the available memory. Then I agree that there is a good case for putting it on hold until enough memory is available, although that is a non-trivial problem which is somewhat outside of the scope of what I am trying to do. And the third case is the one that I am interested in - a runaway process which will eventually be OOMed. In this case, the quota will stop it from trampling on the working set of every other process in memory in the meantime.</font><br> Actually case 2 could be handled to some extent by lowering the priority of a process that kept on swapping for too long.<br> </div> ** Encouragement encouragement encouragement ** http://lwn.net/Articles/362070/rss 2009-11-16T13:45:37+00:00 michaeljt <div class="FormattedComment"> Ahem, I haven't thought that far ahead yet :) So far it is one of a few small projects I have lined up for whenever I have time, but I was posting here in order to get some feedback from wiser minds than my own before I made a start.<br> </div> A suggestion http://lwn.net/Articles/362027/rss 2009-11-15T20:03:07+00:00 jlmassir <div class="FormattedComment"> Killing a child if there is no memory for a fork-exec is kinda cruel.<br> </div> A suggestion http://lwn.net/Articles/361981/rss 2009-11-14T20:52:23+00:00 Gady <div class="FormattedComment"> Killing the child process if it uses more than 10% is kinda cruel. There are no rules against the child doing that. What should be done is that in this case the memory is allocated, and if that cannot be done, then the child is killed.<br> </div> Per-process memory limits? http://lwn.net/Articles/361947/rss 2009-11-14T12:11:39+00:00 efexis <div class="FormattedComment"> You can do this using cgroups Resource Counters / Memory Resource Controller. This lets you see the memory usage estimates for each group (they're estimates because of shared libraries etc), change the limits on the fly, and also change which group a process belongs to (with new processes belonging to the group of its parent process by default).<br> <p> <p> </div> ** Encouragement encouragement encouragement ** http://lwn.net/Articles/361917/rss 2009-11-13T22:32:15+00:00 efexis <div class="FormattedComment"> I (for one) would be most interested in your work. The systems I manage are very binary in whether they're behaved or not, because I have configured them to behave (ie, how much memory is available, decide how much to give to database query caching etc, so everything just works). I try to keep swap file around 384Meg whether the system has 1G or 8G of RAM because that's a nice size to swap stuff out that you don't need to keep in memory, but using disk as virtual RAM is just way too slow, I'd prefer processes be denied memory requests than have them granted at the cost of slowing the whole system down. But all in all, because everything's set up for the amount of memory available, the only time I will get into OOM situations is when there is a runaway process (I manage systems for hosting small numbers of database driven websites, some of them may be developed on windows systems and then moved to the linux system, most are written in PHP which has a very low bar of entry, and so developers often do not have a clue when it comes to writing scalable code).<br> <p> So, what I would want is something that assumes that most of the system is being well behaved, but will quickly chop off anything that is not, and will stop the badly bahaved stuff from dragging the well behaved stuff down with it. The well behaved stuff quite simply doesn't need managing; that's my job. The badly behaved stuff needs taking care of quickly, by something that your idea seems to reflect *perfectly* (it's not often you read someones ideas and your brain flips "that's -exactly- what I need").<br> <p> How would I find out if you do get chance to hammer out the code that achieves this? Is there an non-LKML route to watch this (please don't say twitter :-p )<br> <p> <p> <p> </div> The existence of OOM is one of the few really stupid things in Linux http://lwn.net/Articles/361615/rss 2009-11-12T09:50:45+00:00 rlhamil <div class="FormattedComment"> While optimistic overcommit might be _statistically_ better, it's not deterministic enough<br> for my liking. And my liking is that everything other than /dev/random is _totally_<br> deterministic (neglecting external input of course).<br> <p> (I'd argue that overcommit-by-default is an invitation to denial of service attack, and, if<br> likely victims were more or less predictable, might be a "covert channel" as well.)<br> <p> Solaris doesn't do overcommit, but does also offer MAP_NORESERVE, so that individual<br> mmap() operations can opt out of a reserve, in which case a write to a private mapping<br> (copy-on-write from a file) can cause the process to receive SIGSEGV or SIGBUS; see<br> <p> <a rel="nofollow" href="http://docs.sun.com/app/docs/doc/816-5167/mmap-2?l=en&amp;a=view">http://docs.sun.com/app/docs/doc/816-5167/mmap-2?l=en&amp;...</a><br> (the online version of the mmap() man page for Solaris 10)<br> <p> I think that all that's missing is:<br> * a system call to turn on or off similar behavior for heap and/or stack, and to<br> turn on or off _implicit_ MAP_NORESERVE on all private mappings for that process<br> and its subsequently forked children (reset on exec)<br> * a shared library feature to implement system policy specifying which executables<br> should be be subject to overcommit, with a settable default for all not explicitly specified<br> * an OS default of no overcommit<br> * no OOM killer needed<br> <p> Distros could supply default policy that opted for overcommit on chronically hoggish<br> (and typically not critical to system integrity) apps such as browsers. People might e.g.<br> not mind their browser dying a few more times than it would anyway, but might be very<br> glad to be sure that their X server (desktop user) or database server process was safe from<br> nondeterministic behavior possibly triggered by another process.<br> <p> That gets overcommit out of the OS, and pushes the decisions into user space. A process<br> could always override policy with the system calls, but it would have to know what it was<br> doing to do that.<br> <p> The only limitation with implementing the defaults for an executable in the dynamic linker<br> is that it wouldn't be able to allow overcommit for static executables. If that was a serious<br> limitation, a new mechanism would be needed to push the policy settings into the kernel,<br> and execve() (or equivalents) would have to implement them, which is IMO more comprehensive<br> but otherwise uglier.<br> <p> </div> Per-process memory limits? http://lwn.net/Articles/361592/rss 2009-11-12T06:38:10+00:00 etrusco <div class="FormattedComment"> (continuing my monologue...)<br> It would be nice, nonetheless, to be able set the limits from different process (e.g. a window manager) instead of resorting to a launcher and having to define the limit upfront...<br> </div> Per-process memory limits? http://lwn.net/Articles/361585/rss 2009-11-12T05:58:09+00:00 etrusco <div class="FormattedComment"> Oops, never mind. I should have RTFM before posting :-$<br> </div> Per-process memory limits? http://lwn.net/Articles/361582/rss 2009-11-12T05:51:10+00:00 etrusco <div class="FormattedComment"> Sorry, I meant a different limit for each process, AFAICT setrlimit/sysctl work globally?<br> </div> A suggestion http://lwn.net/Articles/361576/rss 2009-11-12T05:17:56+00:00 jlmassir <div class="FormattedComment"> Maybe then the solution to this problem would be:<br> <p> 1. Never allow overcommit when calling malloc<br> 2. Allow overcommit on fork/exec, but kill the child process if it tries to <br> write to more than 10% of its virtual size.<br> <p> This way, buggy programs that malloc too much memory and never use them <br> would be fixed and fork bombs would be killed, while still allowing to do do <br> system calls between fork and exec.<br> <p> What do you think?<br> <p> </div> Per-process memory limits? http://lwn.net/Articles/361509/rss 2009-11-11T20:30:22+00:00 oak <div class="FormattedComment"> It would also be nice if setrlimit() actually would work properly.<br> <p> ...For something else than VmSize limit which is useless for processes <br> that mmap() files.<br> <p> </div> death by swap http://lwn.net/Articles/361054/rss 2009-11-09T12:34:09+00:00 hppnq You may want to look at Documentation/cgroups/memory.txt. Otherwise, it seems there is no way to enforce RSS limits. Rik van Riel wrote a patch a few years ago but it seems to have been dropped. <p> Personally, I would hate to think that my system spends valuable resources managing runaway processes. ;-) Per-process memory limits? http://lwn.net/Articles/361040/rss 2009-11-09T09:22:25+00:00 hppnq <em><blockquote>It would be nice if you could trigger actions other than 'die, fiend!' on exceeding a limit</blockquote></em> <p> Some attempts to exceed a limit specified using setrlimit are met with an error rather than a kill, and I think all the signals delivered can be handled if appropriate measures are taken. Whether that is a good idea is another question. ;-) death by swap http://lwn.net/Articles/361039/rss 2009-11-09T09:02:01+00:00 michaeljt <div class="FormattedComment"> <font class="QuotedText">&gt; If you get to the point that you're stealing a page from a process simply because that process is over its quota of real memory, you should steal ALL that process' pages. It can't fit its working set into memory, so it isn't going to make decent progress, so the memory you do give it is wasted.</font><br> I suppose I see three cases here. One is that the page was part of the process' working set at an earlier point in time, but no longer is. In that case swapping it out is the right thing to do. The other is that the process is in control, but it's working set is bigger than the available memory. Then I agree that there is a good case for putting it on hold until enough memory is available, although that is a non-trivial problem which is somewhat outside of the scope of what I am trying to do. And the third case is the one that I am interested in - a runaway process which will eventually be OOMed. In this case, the quota will stop it from trampling on the working set of every other process in memory in the meantime.<br> <p> While we are on the subject, does anyone reading this know where RSS quotas are handled in the current kernel code? I was able to find the original patches enabling them, but the code seems to have changed out of recognition since then.<br> </div> posix_spawn is stupid as a system call http://lwn.net/Articles/361023/rss 2009-11-08T23:34:09+00:00 nix <div class="FormattedComment"> Yeah, breaking the entire installed base of Linux apps would probably be a <br> *bad* move :) I think, if you wanted to do this, you'd have to introduce a <br> huge pile of new syscalls and reimplement the old ones as thin wrappers <br> (inside the kernel so as not to force everyone to upgrade glibc) calling <br> the new ones.<br> <p> </div> The existence of OOM is one of the few really stupid things in Linux http://lwn.net/Articles/361021/rss 2009-11-08T23:32:16+00:00 nix <div class="FormattedComment"> Yeah, but forking to exec immediately afterwards is the common case. If <br> you make that some weird nonportable new variant, 90% of programs are <br> never going to use it, and none of the rest will until some considerable <br> time has passed (time for this call to percolate down into the kernel and <br> glibc --- and try getting this call past Ulrich, ho ho.)<br> <p> (Anyway, we *have* fork_to_exec_soon(). It's called vfork().)<br> </div> posix_spawn is stupid as a system call http://lwn.net/Articles/361011/rss 2009-11-08T21:26:18+00:00 epa <div class="FormattedComment"> From a purist point of view, all these 'new' calls are generalizations of the existing ones taking an extra pid argument, so they can just replace them, with the old ones provided by the C library; of course in the real world there is such a thing as backward compatibility :-p.<br> </div> The existence of OOM is one of the few really stupid things in Linux http://lwn.net/Articles/361010/rss 2009-11-08T21:21:52+00:00 epa I don't think it matters much if a few slightly-buggy applications use the wrong variant. If 90% of userspace including the most important programs such as shells passes the right hint to the kernel, the kernel can make better decisions than it does now, and the need for the OOM killer will be reduced. It's a similar situation with raw I/O, for example: a disk-heavy program such as a database server might know that it will scan through a large file just once. Ordinarily this file's contents might clog up the page cache and evict more useful things. To help get more consistent performance, apps can be coded to hint to the kernel that it needn't bother to cache a particular I/O request. The default is still to cache it, and it's not catastrophic if one or two userspace programs haven't been tuned to use the new fancy hinting mechanism. <blockquote> but forget the fork then exec situation for a moment and consider the real fork situation. for a large app, most of the memory will never get modified by either process, and so even there it will almost never use the 2x memory that has been reserved for it. </blockquote> Very true, but of course there's no way for the kernel to know this. I expect most apps would prefer the fork to either succeed for sure, or fail at once if not enough memory can be guaranteed. There may be a few where optimistically hoping for the best and perhaps killing a random process later is the ideal behaviour. Per-process memory limits? http://lwn.net/Articles/360992/rss 2009-11-08T11:56:58+00:00 nix <div class="FormattedComment"> We *have* setrlimit(). It would be nice if you could trigger actions other <br> than 'die, fiend!' on exceeding a limit, but it's not essential: you could <br> have a parent monitoring process which spots the kill and takes <br> appropriate action (though figuring out which limit the child exceeded, or <br> whether it exceeded a limit at all or was just randomly killed by the <br> admin, might be harder).<br> <p> </div> Per-process memory limits? http://lwn.net/Articles/360978/rss 2009-11-08T03:19:37+00:00 etrusco <div class="FormattedComment"> Not exactly related, but since the article talks about "badly behaved Firefox", it would be kind of nice to have syscalls to set a VM (or RSS, etc) size limit for a process... (and trigger a callback, or suspend or kill the process)<br> <p> (Sure, an interested application could limit its own heap usage through its memory allocator, but this couldn't stop a DoS from a virus/code injection.)<br> </div> death by swap http://lwn.net/Articles/360944/rss 2009-11-07T17:06:33+00:00 giraffedata <blockquote> but back in the 70's they realized that most of the time most programs don't use all their memory at any one time. so the odds are pretty good that the page of ram that you swap out will not be needed right away. </blockquote> <p> I think you didn't follow the scenario. We're specifically talking about a page that is likely to be needed right away. It's a page that the normal page replacement policy would have left alone because it expected it to be needed soon -- primarily because it was accessed recently. <p>But the proposed policy would steal it anyway, because the process that is expected to need it is over its quota and the policy doesn't want to harm other processes that aren't. <p>What was known in the 70s was that at any one time, a program has a subset of memory it accesses a lot, which was dubbed its working set. We knew that if we couldn't keep a process' working set in memory, it was wasteful to run it at all. It would page thrash and make virutally no progress. Methods abounded for calculating the working set size, but the basic idea of keeping the working set in memory or nothing was constant. death by swap http://lwn.net/Articles/360931/rss 2009-11-07T10:01:11+00:00 dlang <div class="FormattedComment"> if the program you are stealing the memory from needs it to make progress, you would be right.<br> <p> but back in the 70's they realized that most of the time most programs don't use all their memory at any one time. so the odds are pretty good that the page of ram that you swap out will not be needed right away.<br> <p> and the poor programming practices that are commone today make this even more true<br> </div> death by swap http://lwn.net/Articles/360915/rss 2009-11-07T03:39:30+00:00 tdwebste <div class="FormattedComment"> <p> On embedded devices I have constructed processing states with runit to control the running processes. This simple but effective long term scheduling to avoid out memory/swapping, works well when you know in advance what processes will be running on the device. <br> </div> death by swap http://lwn.net/Articles/360905/rss 2009-11-07T01:21:03+00:00 giraffedata If you get to the point that you're stealing a page from a process simply because that process is over its quota of real memory, you should steal ALL that process' pages. It can't fit its working set into memory, so it isn't going to make decent progress, so the memory you do give it is wasted. You're also wasting the swap I/O it's doing. After a while, after other processes have had a chance to progress, you can swap them out and give the first process the memory it needs. If you can't do that because it's run amok and simply demands more memory than you can afford, that's when you kill that process. <p> Algorithms for this were popular in the 1970s for batch systems. Unix systems were born as interactive systems where the idea of not dispatching a process at all for ten seconds was less palatable than making the user kill some stuff or reboot, but with Unix now used for more diverse things, I'm surprised Linux has never been interested in long term scheduling to avoid page thrashing. why not posix_spawn()? http://lwn.net/Articles/360897/rss 2009-11-06T23:23:09+00:00 cmccabe <div class="FormattedComment"> <font class="QuotedText">&gt; Any good reasons why vfork() should be avoided?</font><br> <p> Ah. Found it.<br> <p> <a href="https://www.securecoding.cert.org/confluence/display/seccode/POS33-C.+Do+not+use+vfork%28%29">https://www.securecoding.cert.org/confluence/display/secc...</a><br> <p> <font class="QuotedText">&gt; Due to the implementation of the vfork() function, the parent process is </font><br> <font class="QuotedText">&gt; suspended while the child process executes. If a user sends a signal to </font><br> <font class="QuotedText">&gt; the child process, delaying its execution, the parent process (which is </font><br> <font class="QuotedText">&gt; privileged) is also blocked. This means that an unprivileged process can </font><br> <font class="QuotedText">&gt; cause a privileged process to halt, which is a privilege inversion </font><br> <font class="QuotedText">&gt; resulting in a denial of service.</font><br> <p> clone(CLONE_VM) + exec might be the win...<br> <p> Colin<br> </div> why not posix_spawn()? http://lwn.net/Articles/360891/rss 2009-11-06T22:55:44+00:00 cmccabe <div class="FormattedComment"> <font class="QuotedText">&gt; Any good reasons why vfork() should be avoided?</font><br> <p> The manual page installed on my system says that copy-on-write makes vfork unecessary. It concludes with "it is rather unfortunate that Linux revived this specter from the past." :)<br> <p> However... it seems like the results you've posted show quite a substantial performance gain for vfork + exec as opposed to fork + exec, for processes with large heaps.<br> <p> Maybe the "preferred" way to do this on Linux would be using clone(2)??<br> <p> C.<br> </div> why not posix_spawn()? http://lwn.net/Articles/360851/rss 2009-11-06T19:28:08+00:00 mikov <div class="FormattedComment"> I am not sure what you mean. Unless I am missing something, vfork() is much more flexible and easier to use than posix_spawn().<br> <p> If your purpose is to call exec() after fork(), you should just be able to mechanically replace all forks() with vforks() and get a big boost. <br> </div> Toward a smarter OOM killer http://lwn.net/Articles/360845/rss 2009-11-06T19:17:31+00:00 dlang <div class="FormattedComment"> one thing that would be very nice to have show up in top (and similar tools) is how much ram _would_ be needed to satisfy all possible COW splits so that admins could get an idea of how overcommitted the kernel currently is.<br> <p> I wouldn't be surprised to find that much of the time the ratio of overcommit rises significantly shortly before the OOM killer kicks in.<br> </div> The existence of OOM is one of the few really stupid things in Linux http://lwn.net/Articles/360844/rss 2009-11-06T19:14:25+00:00 dlang <div class="FormattedComment"> and if an application misuses this and does fork_intend_to_exec_soon() and then doesn't exec soon, what would the penalty be?<br> <p> if applications can misuse this without a penalty they will never get it right (especially when using it wrong will let their app keep running in cases where the fork would otherwise fail)<br> <p> but forget the fork then exec situation for a moment and consider the real fork situation. for a large app, most of the memory will never get modified by either process, and so even there it will almost never use the 2x memory that has been reserved for it.<br> </div> why not posix_spawn()? http://lwn.net/Articles/360843/rss 2009-11-06T19:12:37+00:00 khc <div class="FormattedComment"> you are right that the speed of fork() is seldom noticeable in a GUI program, but it bites me all the time in daemons (big daemon wanting to launch many processes, one by one, do do some tasks). vfork() is too limiting because all you can do after is exec(), but sometimes you do want to extra flexibility that posix_spawn can provide.<br> <p> I have to admit that I have never checked to see if posix_spawn fits my need, though. Since I only care about linux and posix_spawn on linux is the same as fork()/.../exec(), it's useless for me anyway.<br> </div>