首页 > 其他分享 ># 优化底层启动方式 UWSGI 和 gunicorn 比对

# 优化底层启动方式 UWSGI 和 gunicorn 比对

时间:2024-11-19 22:57:05浏览次数:1  
标签:log Web gunicorn app UWSGI 日志 uwsgi 底层

UWSGI 和 Gunicorn 比对

摘要: 本文档旨在对 PythonWeb项目 优化底层启动方式进行比较,特别是 UWSGI 和 Gunicorn。UWSGI(Universal Web Server Gateway Interface)是一种 Python Web 服务器网关接口,它可以与各种 Web 服务器结合使用,提供高效的 Web 应用程序部署解决方案。Gunicorn(Green Unicorn)是一个基于 Python 的 Web 服务器,它是一个预叉装的、多进程的 Web 服务器,专为运行 Python Web 应用程序而设计。我们将从性能、资源利用和易用性等方面对这两种启动方式进行比较。

一、引言

在 Web 应用程序的部署中,选择合适的 Web 服务器和启动方式对于性能和资源利用率至关重要。UWSGI 和 Gunicorn 是两种常用的 Python Web 服务器和启动方式,它们都提供了高效的 Web 应用程序部署解决方案。

二、UWSGI 和 Gunicorn 简介

UWSGI 是一种 Python Web 服务器网关接口,它可以与各种 Web 服务器结合使用,提供高效的 Web 应用程序部署解决方案。UWSGI 的主要优点是它的灵活性和可扩展性,它可以与各种 Web 服务器和框架结合使用,提供高性能的 Web 应用程序部署解决方案。

Gunicorn 是一个基于 Python 的 Web 服务器,它是一个预叉装的、多进程的 Web 服务器,专为运行 Python Web 应用程序而设计。Gunicorn 的主要优点是它的性能和资源利用率,它可以在一台服务器上运行多个 Python Web 应用程序,提供高效的 Web 应用程序部署解决方案。

三、性能比较

我们使用了相同的硬件配置和测试环境,对 UWSGI 和 Gunicorn 的性能进行了测试。测试结果表明,UWSGI 的性能要优于 Gunicorn,特别是在高并发和大流量的情况下。UWSGI 可以更好地利用多核 CPU 和内存,提供更高的并发处理能力和更快的响应时间。

四、资源利用率比较

我们对 UWSGI 和 Gunicorn 的资源利用率进行了测试。测试结果表明,UWSGI 的资源利用率要优于 Gunicorn,特别是在内存使用方面。UWSGI 可以更好地控制内存使用,避免内存泄漏和内存溢出等问题。

五、易用性比较

UWSGI 和 Gunicorn 的易用性都比较好,它们都提供了简单的配置和部署方式。但是,UWSGI 的配置和部署方式更加灵活,它可以与各种 Web 服务器和框架结合使用,提供更加定制化的部署解决方案。

六、结论

综上所述,UWSGI 和 Gunicorn 都是优秀的 Python Web 服务器和启动方式,它们都提供了高效的 Web 应用程序部署解决方案。但是,从性能、资源利用率和易用性等方面来看,UWSGI 更加优秀,它可以提供更高的性能和更好的资源利用率,同时也更加灵活和易于定制。因此,我们建议在优化底层启动方式时,优先考虑使用 UWSGI。

难点:

  1. 日志切割。
    1. 因为在 linux系统下,一个进程打开文件时使用的是文件系统的 inode 编号而非文件名。移动或者重命名一个文件,并不会修改它的 inode 编号。因此需要在进行 rotate 之后,通知 uwsgi 重新打开 log 文件。
  2. 请求队列缓存问题。 请求堆积在uwsgi 队列中。 Uwsgi 重启后 消费队列中的数据产生异常。服务进程发生变化。 需要二次验证

硬件:

  • 假设服务器有 4 个 CPU 核心和 8GB 内存,以下是推荐的配置:
    • 进程数:8(4 个核心 * 2 个进程/核心)
    • 线程数:2(每个进程 2 个线程)

Uwsgi logto 和 logrotate 区别

配置复杂度:
    logto:配置简单,直接在 uWSGI 配置文件中指定日志文件路径。 # 自己写日志轮转
    logrotate:配置相对复杂,需要单独的配置文件和定期任务。 # 脱了服务。7 , 天天
功能:
    logto:仅负责将日志写入指定文件,不具备轮转、压缩等功能。
    logrotate:提供全面的日志管理功能,包括定期轮转、压缩、删除旧日志等。
灵活性:
    logto:适用于简单的日志记录需求。
    logrotate:适用于需要复杂日志管理策略的生产环境。
    
# 总结
使用 logto 需要编写 日志轮转 shell 代码
使用 logrotate 不需要编写 日志轮转代码 

uwsgi 实现日志方式

方式一:Supervisor + uwsgi + logto

配置文件 uwsgi.ini
[uwsgi]
master = true
threaded-logger = true
chdir = /project/xxx_sys
listen = 14400
pidfile = app.pid
log-format = %(addr) - [%(ltime)] %(status) "%(method) %(uri) %(proto)" %(size) "%(uagent)"
wsgi-file = app.py
callable = app
http-socket = :5000
processes = 16
threads = 2
buffer-size = 65537
lazy-apps = true
log-master = true
logto = /project/xxx_sys/app.log
master-fifo = /project/xxx_sys/uwsgi.fifo
Supervisor 创建app服务
# vim  /etc/supervisor/conf.d/app.conf
[program:app]
command=uwsgi --ini /project/xxx_sys/uwsgi.ini
directory=/project/xxx_sys
restart.sh 重构。包含:
  • git文件拉取。

  • 数据库迁移。

  • log文件搬迁。

  • fifo 通知uwsgi的logto文件。

  • supervisor重启 uwsgi

  • 区分 online 和 本地开发测试两种模式。本地继续使用 app.py 启动,online 使用上述流程

方式二:Supervisor + uwsgi + logoter

uwsgi.ini
[uwsgi]
master = true
chdir = /project/xxx_sys/
pidfile = app.pid
log-format = [pid: %(pid)|app: -|req: -/-] %(addr) (%(user)) {%(vars) vars in %(pktsize) bytes} [%(ctime)] %(method) %(uri) => generated %(rsize) bytes in %(msecs) msecs (%(proto) %(status)) %(headers) headers in %(hsize) bytes (%(switches) switches on core %(core))
wsgi-file = app.py
callable = app
http-socket = :88
processes = 16
threads = 8
buffer-size = 65537
enable-threads = true
listen = 1440
lazy-apps = true
reload-mercy = 1
worker-reload-mercy = 1
logto = /project/xxx_sys/log/uwsgi/app.log
log-master = true
threaded-logger = true
master-fifo = /project/xxx_sys/log/uwsgi.fifo

Supervisor 创建app服务

# vim  /etc/supervisor/conf.d/app.conf
[program:app]
command=uwsgi --ini /project/xxx_sys/uwsgi.ini
directory=/project/xxx_sys/
配置 logrotate
# cd /etc/logrotate.d
# vim app
# logrotate -df /etc/logrotate.d/app 手动执行日志轮转

/project/xxx_sys/log/uwsgi/app.log {
        create 0664 root root
        daily
        compress
        delaycompress
        missingok
        dateext
        dateyesterday
        rotate 10
        notifempty
        sharedscripts
        # 执行完毕 rotate 之后,通知 uWSGI 重新打开日志,以下两种方法任选其一
        postrotate
            echo l > /project/xxx_sys/log/uwsgi.fifo
        endscript
}
# 手动触发日志轮转。logrotate -vf -s /project/xxx_sys/log/uwsgi/bak_log/app01.log /etc/logrotate.d/app

总结

  1. Flask app 服务使用 uwsgi 依托 守护运行,才能实现日志轮转。即: nohup,& , supervisor等
  2. Supervisor 可以实现自动重启。 可以将看门狗服务核心代码 添加到 supervisor 中管控
  3. 性能uwsgi 更好
  4. Gunicorn 和 uwsgi 。部署流程上一样。 仅配置文件不同,综合说uwsgi性能高于gunicorn
  5. 推荐使用 方式二 (日志轮转不自由,服务自由)。 但是 方式一 更适合目前app项目 :(日志自由,服务自由)

标签:log,Web,gunicorn,app,UWSGI,日志,uwsgi,底层
From: https://www.cnblogs.com/dengz/p/18555806

相关文章

  • .NET Core 特性(Attribute)底层原理浅谈
    简介烂大街的资料不再赘述,简单来说就是给代码看的注释Attribute的使用场景Attribute不仅仅局限于C#中,在整个.NET框架中都提供了非常大的拓展点,任何地方都有Attribute的影子编译器层比如Obsolete,ConditionalC#层GET,POST,Max,Range,RequireCLRVM层StructLayout,DllImp......
  • 三周精通FastAPI:42 手动运行服务器 - Uvicorn & Gunicorn with Uvicorn
    官方文档:ServerWorkers-GunicornwithUvicorn-FastAPI使用 fastapi运行命令¶可以直接使用fastapirun命令来启动FastAPI应用:fastapirunmain.py如创建openapi.py文件:fromfastapiimportFastAPIapp=FastAPI(openapi_url="/api/v1/openapi.json")@app.g......
  • JDBC学习笔记(四)--JdbcUtil工具类的底层实现、解决 java.sql.SQLException: Operation
    目录(一)为什么要使用JdbcUtil工具类(二)创建一个prorperties文件1.在文件目录或src目录下,选择新建FIle2.创建properties文件 3.编写配置文件Java基础:反射4.获取资源的方式第一种第二种 ​编辑 第三种(一)为什么要使用JdbcUtil工具类问题:在编写jdbc的时候,在每一......
  • Redis深入底层数据结构(万字详细)
    RedisRedis基本数据类型Redis支持5种数据类型:string(字符串)hash(哈希)list(列表)set(集合)zset(sortedset:有序集合)Stringstring:一个key对应一个value。string类型是二进制安全的,可以存储任何类型的数据常用命令:get,set,incr,decr,mget等hashhash:一个string类型的field......
  • .NET Core 反射底层原理浅谈
    简介反射,反射,程序员的快乐。前期绑定与后期绑定在.NET中,前期绑定(EarlyBinding)是指在编译时就确定了对象的类型和方法,而后期绑定(LateBinding)或动态绑定是在运行时确定对象的类型和方法。前置知识:C#类型系统结构C#作为C++++,在类型系统上沿用C++的类型系统前期绑定在代......
  • MyBatis面试题--(底层原理与基本概念)
    目录什么是Mybatis?MyBatis的好处是什么?什么是ORM?有何作用?MyBatis中的SqlSession是什么?有什么作用?1>什么是SqlSession?2>SqlSession的作用解释一下SqlSessionFactory的作用并解释它如何使用SqlSessionFactory的作用?如何使用SqlSessionFactory1.添加依赖2.配置数据源和S......
  • .NET Core 泛型底层原理浅谈
    .NETCore泛型底层原理浅谈 简介泛型参考资料烂大街,基本资料不再赘述,比如泛型接口/委托/方法的使用,逆变与协变。泛型好处有如下几点代码重用算法重用,只需要预先定义好算法,排序,搜索,交换,比较等。任何类型都可以用同一套逻辑类型安全编译器保证不会将int传给string简单清......
  • .NET Core 委托底层原理浅谈
    简介.NET通过委托来提供回调函数机制,与C/C++不同的是,委托确保回调是类型安全,且允许多播委托。并支持调用静态/实例方法。简单来说,C++的函数指针有如下功能限制,委托作为C#中的上位替代,能弥补函数指针的不足。类型不安全函数指针可以指向一个方法定义完全不同的函数。在编译期......
  • 深入理解MySQL索引的底层原理和优化
    深入理解MySQL索引的底层原理和优化1.什么是索引索引是帮助MySQL高效获取数据的排好序的数据结构。用于提高查询性能,相当于书的目录。比如我们在读一本书的时候,首先是通过目录来定位到文章的页码,然后通过页码再来快速定位到具体的内容。MySQL中也是一样,在查询数据的时候,首先看......
  • 平时有使用过AI服务吗——AI人工服务案例助力你了解底层代码逻辑!
    让我们详细说明这个智能客服系统包含的内容,并提供完整的代码示例。我们将涵盖以下几个方面:智能客服(使用Rasa)情感分析(使用HuggingFaceTransformers)自然语言生成(NLG)(使用HuggingFaceTransformers)语音识别(ASR)(使用SpeechRecognition)语音合成(TTS)(使用gTTS)用户行为分析(使用Pandas......