• Max Kellermann's avatar
    MDEV-34994: sql/mysqld: stop accept() loop after the first EAGAIN · 53f5ee79
    Max Kellermann authored
    Each time a listener socket becomes ready, MariaDB calls accept() ten
    times (MAX_ACCEPT_RETRY), even if all but the first one return EAGAIN
    because there are no more connections.  This causes unnecessary CPU
    usage - on our server, the CPU load of that thread, which does nothing
    but accept(), saturates one CPU core by ~45%.  The loop should stop
    after the first EAGAIN.
    
    Perf report:
    
        11.01%  mariadbd  libc.so.6          [.] accept4
         6.42%  mariadbd  [kernel.kallsyms]  [k] finish_task_switch.isra.0
         5.50%  mariadbd  [kernel.kallsyms]  [k] _raw_spin_unlock_irqrestore
         5.50%  mariadbd  [kernel.kallsyms]  [k] syscall_enter_from_user_mode
         4.59%  mariadbd  [kernel.kallsyms]  [k] __fget_light
         3.67%  mariadbd  [kernel.kallsyms]  [k] kmem_cache_alloc
         2.75%  mariadbd  [kernel.kallsyms]  [k] fput
         2.75%  mariadbd  [kernel.kallsyms]  [k] mod_objcg_state
         1.83%  mariadbd  [kernel.kallsyms]  [k] __inode_wait_for_writeback
         1.83%  mariadbd  [kernel.kallsyms]  [k] __sys_accept4
         1.83%  mariadbd  [kernel.kallsyms]  [k] _raw_spin_unlock_irq
         1.83%  mariadbd  [kernel.kallsyms]  [k] alloc_inode
         1.83%  mariadbd  [kernel.kallsyms]  [k] call_rcu
    53f5ee79
mysqld.cc 341 KB