… | |
… | |
1538 | |
1538 | |
1539 | So when you encounter spurious, unexplained daemon exits, make sure you |
1539 | So when you encounter spurious, unexplained daemon exits, make sure you |
1540 | ignore SIGPIPE (and maybe make sure you log the exit status of your daemon |
1540 | ignore SIGPIPE (and maybe make sure you log the exit status of your daemon |
1541 | somewhere, as that would have given you a big clue). |
1541 | somewhere, as that would have given you a big clue). |
1542 | |
1542 | |
|
|
1543 | =head3 The special problem of accept()ing when you can't |
|
|
1544 | |
|
|
1545 | Many implementations of the POSIX C<accept> function (for example, |
|
|
1546 | found in port-2004 Linux) have the peculiar behaviour of not removing a |
|
|
1547 | connection from the pending queue in all error cases. |
|
|
1548 | |
|
|
1549 | For example, larger servers often run out of file descriptors (because |
|
|
1550 | of resource limits), causing C<accept> to fail with C<ENFILE> but not |
|
|
1551 | rejecting the connection, leading to libev signalling readiness on |
|
|
1552 | the next iteration again (the connection still exists after all), and |
|
|
1553 | typically causing the program to loop at 100% CPU usage. |
|
|
1554 | |
|
|
1555 | Unfortunately, the set of errors that cause this issue differs between |
|
|
1556 | operating systems, there is usually little the app can do to remedy the |
|
|
1557 | situation, and no known thread-safe method of removing the connection to |
|
|
1558 | cope with overload is known (to me). |
|
|
1559 | |
|
|
1560 | One of the easiest ways to handle this situation is to just ignore it |
|
|
1561 | - when the program encounters an overload, it will just loop until the |
|
|
1562 | situation is over. While this is a form of busy waiting, no OS offers an |
|
|
1563 | event-based way to handle this situation, so it's the best one can do. |
|
|
1564 | |
|
|
1565 | A better way to handle the situation is to log any errors other than |
|
|
1566 | C<EAGAIN> and C<EWOULDBLOCK>, making sure not to flood the log with such |
|
|
1567 | messages, and continue as usual, which at least gives the user an idea of |
|
|
1568 | what could be wrong ("raise the ulimit!"). For extra points one could stop |
|
|
1569 | the C<ev_io> watcher on the listening fd "for a while", which reduces CPU |
|
|
1570 | usage. |
|
|
1571 | |
|
|
1572 | If your program is single-threaded, then you could also keep a dummy file |
|
|
1573 | descriptor for overload situations (e.g. by opening F</dev/null>), and |
|
|
1574 | when you run into C<ENFILE> or C<EMFILE>, close it, run C<accept>, |
|
|
1575 | close that fd, and create a new dummy fd. This will gracefully refuse |
|
|
1576 | clients under typical overload conditions. |
|
|
1577 | |
|
|
1578 | The last way to handle it is to simply log the error and C<exit>, as |
|
|
1579 | is often done with C<malloc> failures, but this results in an easy |
|
|
1580 | opportunity for a DoS attack. |
1543 | |
1581 | |
1544 | =head3 Watcher-Specific Functions |
1582 | =head3 Watcher-Specific Functions |
1545 | |
1583 | |
1546 | =over 4 |
1584 | =over 4 |
1547 | |
1585 | |
… | |
… | |
3838 | fine. |
3876 | fine. |
3839 | |
3877 | |
3840 | If your embedding application does not need any priorities, defining these |
3878 | If your embedding application does not need any priorities, defining these |
3841 | both to C<0> will save some memory and CPU. |
3879 | both to C<0> will save some memory and CPU. |
3842 | |
3880 | |
3843 | =item EV_PERIODIC_ENABLE |
3881 | =item EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, |
|
|
3882 | EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, |
|
|
3883 | EV_ASYNC_ENABLE, EV_CHILD_ENABLE. |
3844 | |
3884 | |
3845 | If undefined or defined to be C<1>, then periodic timers are supported. If |
3885 | If undefined or defined to be C<1> (and the platform supports it), then |
3846 | defined to be C<0>, then they are not. Disabling them saves a few kB of |
3886 | the respective watcher type is supported. If defined to be C<0>, then it |
3847 | code. |
3887 | is not. Disabling watcher types mainly saves codesize. |
3848 | |
|
|
3849 | =item EV_IDLE_ENABLE |
|
|
3850 | |
|
|
3851 | If undefined or defined to be C<1>, then idle watchers are supported. If |
|
|
3852 | defined to be C<0>, then they are not. Disabling them saves a few kB of |
|
|
3853 | code. |
|
|
3854 | |
|
|
3855 | =item EV_EMBED_ENABLE |
|
|
3856 | |
|
|
3857 | If undefined or defined to be C<1>, then embed watchers are supported. If |
|
|
3858 | defined to be C<0>, then they are not. Embed watchers rely on most other |
|
|
3859 | watcher types, which therefore must not be disabled. |
|
|
3860 | |
|
|
3861 | =item EV_STAT_ENABLE |
|
|
3862 | |
|
|
3863 | If undefined or defined to be C<1>, then stat watchers are supported. If |
|
|
3864 | defined to be C<0>, then they are not. |
|
|
3865 | |
|
|
3866 | =item EV_FORK_ENABLE |
|
|
3867 | |
|
|
3868 | If undefined or defined to be C<1>, then fork watchers are supported. If |
|
|
3869 | defined to be C<0>, then they are not. |
|
|
3870 | |
|
|
3871 | =item EV_SIGNAL_ENABLE |
|
|
3872 | |
|
|
3873 | If undefined or defined to be C<1>, then signal watchers are supported. If |
|
|
3874 | defined to be C<0>, then they are not. |
|
|
3875 | |
|
|
3876 | =item EV_ASYNC_ENABLE |
|
|
3877 | |
|
|
3878 | If undefined or defined to be C<1>, then async watchers are supported. If |
|
|
3879 | defined to be C<0>, then they are not. |
|
|
3880 | |
|
|
3881 | =item EV_CHILD_ENABLE |
|
|
3882 | |
|
|
3883 | If undefined or defined to be C<1> (and C<_WIN32> is not defined), then |
|
|
3884 | child watchers are supported. If defined to be C<0>, then they are not. |
|
|
3885 | |
3888 | |
3886 | =item EV_MINIMAL |
3889 | =item EV_MINIMAL |
3887 | |
3890 | |
3888 | If you need to shave off some kilobytes of code at the expense of some |
3891 | If you need to shave off some kilobytes of code at the expense of some |
3889 | speed (but with the full API), define this symbol to C<1>. Currently this |
3892 | speed (but with the full API), define this symbol to C<1>. Currently this |
… | |
… | |
3900 | Defining C<EV_MINIMAL> to C<2> will additionally reduce the core API to |
3903 | Defining C<EV_MINIMAL> to C<2> will additionally reduce the core API to |
3901 | provide a bare-bones event library. See C<ev.h> for details on what parts |
3904 | provide a bare-bones event library. See C<ev.h> for details on what parts |
3902 | of the API are still available, and do not complain if this subset changes |
3905 | of the API are still available, and do not complain if this subset changes |
3903 | over time. |
3906 | over time. |
3904 | |
3907 | |
3905 | This example set of settings reduces the compiled size of libev from 24Kb |
3908 | This example set of settings reduces the compiled size of libev from |
3906 | to 8Kb on my GNU/Linux amd64 system (and leaves little in - there is also |
3909 | 23.9Kb to 7.7Kb on my GNU/Linux amd64 system (and leaves little |
3907 | an effect on the amount of memory used). With an intelligent-enough linker |
3910 | in - there is also an effect on the amount of memory used). With |
3908 | further unused functions might be left out as well automatically. |
3911 | an intelligent-enough linker (gcc+binutils do this when you use |
|
|
3912 | C<-Wl,--gc-sections -ffunction-sections>) further unused functions might |
|
|
3913 | be left out as well automatically - a binary starting a timer and an I/O |
|
|
3914 | watcher then might come out at only 5Kb. |
3909 | |
3915 | |
3910 | // tuning and API changes |
3916 | // tuning and API changes |
3911 | #define EV_MINIMAL 2 |
3917 | #define EV_MINIMAL 2 |
3912 | #define EV_MULTIPLICITY 0 |
3918 | #define EV_MULTIPLICITY 0 |
3913 | #define EV_MINPRI 0 |
3919 | #define EV_MINPRI 0 |
… | |
… | |
3929 | |
3935 | |
3930 | // disable all watcher types that cna be disabled |
3936 | // disable all watcher types that cna be disabled |
3931 | #define EV_STAT_ENABLE 0 |
3937 | #define EV_STAT_ENABLE 0 |
3932 | #define EV_PERIODIC_ENABLE 0 |
3938 | #define EV_PERIODIC_ENABLE 0 |
3933 | #define EV_IDLE_ENABLE 0 |
3939 | #define EV_IDLE_ENABLE 0 |
|
|
3940 | #define EV_CHECK_ENABLE 0 |
|
|
3941 | #define EV_PREPARE_ENABLE 0 |
3934 | #define EV_FORK_ENABLE 0 |
3942 | #define EV_FORK_ENABLE 0 |
3935 | #define EV_SIGNAL_ENABLE 0 |
3943 | #define EV_SIGNAL_ENABLE 0 |
3936 | #define EV_CHILD_ENABLE 0 |
3944 | #define EV_CHILD_ENABLE 0 |
3937 | #define EV_ASYNC_ENABLE 0 |
3945 | #define EV_ASYNC_ENABLE 0 |
3938 | #define EV_EMBED_ENABLE 0 |
3946 | #define EV_EMBED_ENABLE 0 |