以下是根据我们之前的对话整理的技术笔记,涵盖了 Podman 容器管理、uWSGI 优化、Linkding 配置以及相关排查方法。

Podman 容器管理与 uWSGI 优化笔记

1. uWSGI 知识

1.1 什么是 uWSGI

  • 定义:一个实现了 WSGI 协议的 Web 服务器软件,用于运行 Python Web 应用
  • 位置:运行在容器内部,不是 Podman 的一部分
  • 常见场景:Django/Flask 等 Python 应用的线上部署

1.2 uWSGI 内存优化配置

[uwsgi]
; ========== 核心性能参数 ==========
processes = 1          ; 1核机器只用1个进程
threads = 2            ; 2个线程处理I/O等待
enable-threads = true  ; 启用线程支持

; ========== 内存限制 ==========
limit-as = 128         ; 虚拟内存上限128MB
reload-on-rss = 96     ; 物理内存超过96MB时重启worker

; ========== 稳定性保障 ==========
max-requests = 500     ; 每500请求重启,防内存泄漏
harakiri = 30          ; 30秒超时防死锁
harakiri-verbose = true

; ========== 日志优化 ==========
disable-logging = true ; 禁用请求日志,省CPU
log-4xx = true         ; 保留4xx错误日志
log-5xx = true         ; 保留5xx错误日志

; ========== 其他 ==========
buffer-size = 8192
die-on-term = true
vacuum = true

1.3 参数说明

参数含义推荐值
processesworker进程数1核→1
limit-as虚拟内存上限(MB)128
reload-on-rss物理内存阈值(MB)96
max-requests重启前处理请求数500
harakiri请求超时(秒)30

2. Linkding 配置

2.1 问题排查

发现 uWSGI 进程来自 Linkding 容器:

podman top linkding | grep uwsgi
# 输出显示多个 uwsgi 进程

2.2 优化后的 uwsgi.ini

[uwsgi]
module = bookmarks.wsgi:application
env = DJANGO_SETTINGS_MODULE=bookmarks.settings.prod

; 静态文件映射
static-map = /static=static
static-map = /static=data/favicons
static-map = /static=data/previews
static-map = /robots.txt=static/robots.txt

; 核心优化
processes = 1
threads = 2
enable-threads = true

; 内存限制
limit-as = 128
reload-on-rss = 96

; 稳定性
max-requests = 500
harakiri = 30
harakiri-verbose = true

; 资源
pidfile = /tmp/linkding.pid
vacuum = true
uid = www-data
gid = www-data
buffer-size = 8192
die-on-term = true

; 日志(省CPU)
disable-logging = true
log-4xx = true
log-5xx = true

2.3 环境变量控制(if-env 说明)

; 语法:只有当环境变量 LD_DISABLE_REQUEST_LOGS 等于 "true" 时才执行
if-env = LD_DISABLE_REQUEST_LOGS=true
    disable-logging = true
    log-4xx = true
    log-5xx = true
endif =

用法:

# 启用日志禁用功能
podman run -e LD_DISABLE_REQUEST_LOGS=true sissbruecker/linkding:latest

3. 常见镜像内存占用参考

镜像功能内存占用技术栈
Vaultwarden密码管理Rust
CaddyWeb服务器/反向代理Go
Flare导航页~26MB静态文件
Linkding书签管理~150MB(优化后)Python/Django
Wallos财务管理中等PHP

4. 1核1G服务器优化原则

4.1 核心原则

  1. 进程数 ≤ CPU核心数:多进程只会增加上下文切换
  2. 限制内存上限:给每个容器设置 --memory 限制
  3. 禁用不必要的日志:日志I/O会消耗CPU
  4. 定期重启worker:防止内存泄漏(max-requests

4.2 容器内存限制建议

# Linkding(Python应用)
--memory="256m" --memory-swap="256m"

# Vaultwarden(Rust应用)
--memory="128m" --memory-swap="128m"

# Flare(静态页)
--memory="64m" --memory-swap="64m"

5. 常见问题

Q: uWSGI 是什么?是 Podman 的吗?

A: uWSGI 是 Python Web 服务器,运行在容器内部,不是 Podman 的一部分。

Q: reload-on-rssmax-requests 会导致容器频繁重启吗?

A: 不会。它们触发的是 worker 进程内部重启,不是容器重启。重启在毫秒级完成,服务不中断。

Q: 151MB 对 Linkding 来说正常吗?

A: 正常。优化后的 Linkding 占用 150-200MB 属于健康范围,社区反馈默认配置下 512MB 也可能触发 OOM。

Q: 如何确认 uWSGI 来自哪个容器?

A: 使用排查命令:

for name in $(podman ps --format "{{.Names}}"); do 
    echo "=== $name ==="
    podman top $name | grep -i uwsgi || echo "无 uwsgi"
done

标签: none

添加新评论