mariadb/storage/innobase/buf
Marko Mäkelä 2323483528 MDEV-31953 madvise(..., MADV_FREE) is causing a performance regression
buf_page_t::set_os_unused(): Remove the system call that had been added in
commit 16c9718758 and revised in
commit c1fd082e9c for Microsoft Windows.

buf_pool_t::garbage_collect(): A new function to collect any garbage
from the InnoDB buffer pool that can be removed without writing any
log or data files. This will also invoke madvise() for all of buf_pool.free.

To trigger this the following MDEV is implemented:
MDEV-24670 avoid OOM by linux kernel co-operative memory management

To avoid frequent triggers that caused the MDEV-31953 regression, while
still preserving the 10.11 functionality of non-greedy kernel memory
usage, memory triggers are used.

On the triggering of memory pressure, if supported in the Linux kernel,
trigger the garbage collection of the innodb buffer pool.

The hard coded triggers occur where there is:
* some memory pressure in 5 of the last 10 seconds
* a full stall on memory pressure for 10ms in the last 2 seconds

The kernel will trigger only one in each of these time windows. To avoid
mariadb being in a constant state of memory garbage collection, this has
been limited to once per minute.

For a small set of kernels in 2023 (6.5, 6.6), there was a limit requiring
CAP_SYS_RESOURCE that was lifted[1] to support the use case of user
memory pressure. It not currently possible to set CAP_SYS_RESOURCES in
a systemd service as its setting a capability inside a usernamespace.

Running under systemd v254+ requires the default MemoryPressureWatch=auto
(or alternately "on").

Functionality was tested in a 6.4 kernel Fedora successfully under a
systemd service.

Running in a container requires that (unmask=)/sys/fs/cgroup be writable
by the mariadbd process.

To aid testing, the buf_pool_resize was a convient trigger point on
which to trigger garbage collection.

ref [1]: https://lore.kernel.org/all/CAMw=ZnQ56cm4Txgy5EhGYvR+Jt4s-KVgoA9_65HKWVMOXp7a9A@mail.gmail.com/T/#m3bd2a73c5ee49965cb73a830b1ccaa37ccf4e427

Co-Author: Daniel Black (on memory pressure trigger)

Reviewed by: Marko Mäkelä, Vladislav Vaintroub, Vladislav Lesin,
   Thirunarayanan Balathandayuthapani

Tested by: Matthias Leich
2023-11-18 20:12:33 +11:00
..
buf0block_hint.cc MDEV-27058: Reduce the size of buf_block_t and buf_page_t 2021-11-18 17:47:19 +02:00
buf0buddy.cc MDEV-27891: SIGSEGV in InnoDB buffer pool resize 2022-03-07 13:36:18 +11:00
buf0buf.cc MDEV-31953 madvise(..., MADV_FREE) is causing a performance regression 2023-11-18 20:12:33 +11:00
buf0checksum.cc Cleanup: Replace ut_crc32c(x,y) with my_crc32c(0,x,y) 2022-01-21 16:13:04 +02:00
buf0dblwr.cc Merge branch '10.6' into 10.10 2023-11-08 16:23:30 +01:00
buf0dump.cc Merge 10.6 into 10.10 2023-10-14 13:36:11 +03:00
buf0flu.cc Merge branch '10.6' into 10.10 2023-11-08 16:23:30 +01:00
buf0lru.cc Merge 10.10 into 10.11 2023-10-17 16:04:21 +03:00
buf0rea.cc Merge 10.5 into 10.6 2023-09-14 09:01:15 +03:00