面向 OLTP 的 Linux 参数调优
本页目录
下面是面向高并发 OLTP(例如 Web 和移动应用)的 Linux 基础调优建议。其中大部分来自 Autobase 的默认配置,该项目原名为 postgresql_cluster。
请将下列参数视为进一步研究的切入点,文中提供的值仅作为粗略的调优参考,需根据具体情况进行审查。
大部分参数可在 sysctl.conf 中修改,更改后需要调用:
sysctl -p /etc/sysctl.conf
临时更改 (以 vm.swappiness 为例):
sudo sysctl -w vm.swappiness=1
或者:
echo 1 | sudo tee /proc/sys/vm/swappiness
内存管理
vm.overcommit_memory = 2避免内存过度分配,防止 OOM killer 影响 Postgres。
vm.swappiness = 1最小化 swap 使用,避免完全禁用。
💀这是一个具有争议的话题。我个人在关键任务系统中在高负载下使用 0 来禁用 swap,承担OOM 风险。不过,许多专家建议不要完全关闭,可以使用较低值—1 或 10。
相关优质文章:
- Deep PostgreSQL Thoughts: The Linux Assassin (2021,k8s环境),作者 @josepheconway
- PostgreSQL load tuning on Red Hat Enterprise Linux (2022)
vm.min_free_kbytes = 102400确保在内存分配高峰期间为 Postgres 预留可用内存。
transparent_hugepage/enabled=never,transparent_hugepage/defrag=never禁用透明大页 (THP),以防止不适合 Postgres OLTP 工作负载的延迟和碎片。一般建议在 OLTP 系统中禁用 THP (例如 Oracle)。
I/O管理
vm.dirty_background_bytes = 67108864vm.dirty_bytes = 536870912调整 pdflush 以防止 IO 延迟峰值,详见 @grayhemp 的 PgCookbook - a PostgreSQL documentation project。
网络配置
📝 以下是 ipv4 配置;🎯 **TODO:**ipv6 配置待补充
net.ipv4.ip_local_port_range = 10000 65535允许处理更多客户端连接。
net.core.netdev_max_backlog = 10000应对网络流量高峰,避免丢包。
net.ipv4.tcp_max_syn_backlog = 8192适应高并发连接请求。
net.core.somaxconn = 65535增加套接字连接队列的上限。
net.ipv4.tcp_tw_reuse = 1减少高吞吐量 OLTP 应用的连接建立时间。
NUMA配置
vm.zone_reclaim_mode = 0避免跨 NUMA 节点的内存回收对 Postgres 造成性能影响。
kernel.numa_balancing = 0禁用自动 NUMA 平衡,以提高 Postgres 的 CPU 缓存效率。
kernel.sched_autogroup_enabled = 0改善 Postgres 进程调度的延迟。
文件系统和文件句柄
fs.file-max = 262144设置 Linux 内核可以分配的最大文件句柄数量。在运行像 Postgres 这样的数据库服务器时,足够的文件描述符对于处理大量连接和文件至关重要。
🎯 TODO:根据不同主流操作系统进行进一步审查和调整。
我见
文中提到了几个不错的工具:
PgCookbook - a PostgreSQL documentation project
The project is a continuously updating set of articles, scripts and configuration files made to help with PostgreSQL maintenance. The articles and files might be modified as new versions of software or new ways of doing things appear. Stay tuned.
PgToolkit - tools for PostgreSQL maintenance
Currently the package contains the only tool
pgcompact, we are planning to add much more in the future. Stay tuned.The list of changes can be found in CHANGES.md. The To-Do List is in TODO.md.
另外,关于 OOM、虚拟内存、物理内存等,推荐阅读小林的文章,比如在 4GB 物理内存的机器上,申请 8G 内存会怎么样?