V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaopeng163
V2EX  ›  Django

Django 应用程序性能的云监控

  •  
  •   xiaopeng163 · 2015-09-11 07:49:48 +08:00 · 3030 次点击
    这是一个创建于 3364 天前的主题,其中的信息可能已经有所发展或是发生改变。

    source: https://github.com/xiaopeng163/www.pythoner.io/blob/master/source/_posts/tingyun-test.md

    Django 作为 Python 语言中最为流行的 Web 框架,受到越来越多的开发者欢迎。互联网上基于 Django 的站点越来越多,像Disqus, Bitbucket
    如何去监控 Django 应用是目前大家普遍关心的一个问题,并且 Django 作为一个 Web 框架,经常会用到像 Mongodb 这样的 NOSQL 数据库来做后台存储,以及 Memcached 作缓存。作为一个完整的前后台应用,如何去
    监控其整体性能,也是一个问题.

    对于应用级别的监控,很多地方不同于传统的设备和网络监控,大家比较熟悉的协议就是 SNMP,比较熟悉的工具比如 ZABBIX 。传统的这种监控架构, 安装配置和部署都都很复杂,但是绝大部分监控系统的架构原理大同小异,无非就是 agent+server 的模式.

    在应用级别的监控中,对于 Web 性能的监控是很重要的一块内容, Google search web performance test会出来很多结果。

    Could 现在是非常火的,看看OpenStack就知道了。任何一种服务都想和云沾上边,提供云服务,监控也不例外,国外已有不少成熟的产品, 当然云服务有很多的优势,这里不多讲。

    听云是国内较大的一个应用性能监控云平台。其详细介绍可以参考百度百科http://baike.baidu.com/view/14213481.htm。本文会以听云为例,来尝试监控 Django 服务的应用性能。

    Django

    介绍

    Django (维基百科) Django 是一个开放源代码的 Web 应用框架,由 Python 写成。采用了 MVC 的软件设计模式,即模型 M ,视图 V 和控制器 C 。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于 2005 年 7 月在 BSD 许可证下发布。这套框架是以比利时的吉普赛爵士吉他手 Django Reinhardt 来命名的。

    Django 的主要目标是使得开发复杂的、数据库驱动的网站变得简单。 Django 注重组件的重用性和“可插拔性”,敏捷开发和 DRY 法则( Don't Repeat Yourself )。在 Django 中 Python 被普遍使用,甚至包括配置文件和数据模型。

    学习

    Django 的入门非常简单,本质上来说, Django 只不过是用 Python 编写的一组类库。 用 Django 开发站点就是使用这些类库编写 Python 代码。 因此,学习 Django 的关键就是学习如何进行 Python 编程并理解 Django 类库的运作方式。

    如果你有 Python 开发经验,在学习过程中应该不会有任何问题。按照 Django 官方提供的教程一步步来,很快就可以简单入门,并且开发简单的 Django 应用。

    搭建 Django 应用

    如何搭建一个简单的 Django 应用。

    安装

    任何时候安装 Python 类库,都推荐使用virtualenv。然后可以通过源码或者pip安装。

    创建一个简单的项目

    django-admin.py startproject mysite
    

    startproject 命令创建一个目录,包含 4 个文件:

    mysite/
        __init__.py
        manage.py
        settings.py
        urls.py
    

    如果你还没启动服务器的话,请切换到你的项目目录里 (cd mysite ),运行下面的命令:

    python manage.py runserver
    

    你会看到些像这样的
    ```
    Validating models...
    0 errors found.

    Django version 1.0, using settings 'mysite.settings'
    Development server is running at http://127.0.0.1:8000/
    Quit the server with CONTROL-C.
    ```
    这将会在端口 8000 启动一个本地服务器, 并且只能从你的这台电脑连接和访问。 既然服务器已经运行起来了,现在用网页浏览器访问 http://127.0.0.1:8000/ 。 你应该可以看到一个令人赏心悦目的淡蓝色 Django 欢迎页面。 它开始工作了。

    MongoDB 和 Memcached

    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。 Mongo 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
    它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
    * 面向集合存储,易存储对象类型的数据。
    * 模式自由。
    * 支持动态查询。
    * 支持完全索引,包含内部对象。
    * 支持查询。
    * 支持复制和故障恢复。
    * 使用高效的二进制数据存储,包括大型对象(如视频等)。
    * 自动处理碎片,以支持云计算层次的扩展性
    * 支持 RUBY , PYTHON , JAVA , C++, PHP 等多种语言。
    * 文件存储格式为 BSON (一种 JSON 的扩展)
    * 可通过网络访问

    MongoDB 有基于 Python 的 API —— Pymongo 。 Pymongo 用于操作 MongoDB 非常简单。例如:

    # Connection
    from pymongo import MongoClient
    client = MongoClient ('mongodb://localhost:27017/')
    db = client.test_database 
    
    # Insert
    db.posts.insert ({"a": "b"})
    

    memcached 是一种缓存技术,存储在内存中(高性能分布式内存缓存服务器)。目的:提速。(传统的都是把数据保存在关系型数据库管理系统即 RDBMS ,客户端请求时会从 RDBMS 中读取数据并在浏览器中显示,这样当访问量过大时或集中时,导致 RSBMS 负担过重,数据库响应恶化,浏览器中显示延迟等严重问题,使用 memcached 减少数据库查询和访问次数以提高访问速度,提高扩展性)

    Python 对于 Memcached 的操作也非常简单:

    import memcache
    
    mc=memcache.Client (['127.0.0.1:11211'],debug=0 )
    mc.set (“ some_key ”,” Some value ”)
    value=mc.get (“ some_key ”)
    mc.set (“ another_key ”,3 )
    mc.delete (“ another_key )
    mc.set (“ key ”,” 1 ″) #用于自动增量 /减量的必须是字符串
    mc.incr (“ key ”)
    mc.decr (“ key ”)
    

    有了这些基本操作,就可以学习在 Django 应用中使用 MongoDB 和 Memcached 了。

    使用听云 Python 探针监控 Django APP

    打开 https://report.tingyun.com/overview/application 新建一个应用。

    下载安装探针

    # 安装
    $ pip install tingyun
    
    #生成配置
    $ tingyun-admin generate-config YourLicenseKey /tmp/tingyun.ini
    
    # 设置环境变量
    $ export TING_YUN_CONFIG_FILE=/tmp/tingyun.ini
    

    启动探针

    # 重启应用
    $ tingyun-admin run-program 您应用的启动命令 您应用启动参数
    
    # 查看 log
    $ tail -f /tmp/tingyun-agent.log 
    2015-09-06 19:43:38,531 (14365/MainThread ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.framework_django for target module <module 'django.http.multipartparser' from '/usr/local/lib/python2.7/dist-packages/django/http/multipartparser.pyc'>
    2015-09-06 19:43:38,551 (14365/MainThread ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.framework_django for target module <module 'django.template.base' from '/usr/local/lib/python2.7/dist-packages/django/template/base.pyc'>
    2015-09-06 19:43:38,560 (14365/MainThread ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.framework_django for target module <module 'django.core.urlresolvers' from '/usr/local/lib/python2.7/dist-packages/django/core/urlresolvers.pyc'>
    2015-09-06 19:43:38,561 (14365/MainThread ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.framework_django for target module <module 'django.core.handlers.base' from '/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.pyc'>
    2015-09-06 19:43:38,562 (14365/MainThread ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.framework_django for target module <module 'django.core.handlers.wsgi' from '/usr/local/lib/python2.7/dist-packages/django/core/handlers/wsgi.pyc'>
    2015-09-06 19:43:38,564 (14365/MainThread ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.framework_django for target module <module 'django.template.loader_tags' from '/usr/local/lib/python2.7/dist-packages/django/template/loader_tags.pyc'>
    2015-09-06 19:43:38,618 (14365/MainThread ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.database_dbapi2 for target module <module 'MySQLdb' from '/usr/local/lib/python2.7/dist-packages/MySQLdb/__init__.pyc'>
    2015-09-06 19:43:38,669 (14365/Dummy-1 ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.database_mongo for target module <module 'pymongo.collection' from '/usr/local/lib/python2.7/dist-packages/pymongo/collection.pyc'>
    2015-09-06 19:43:38,671 (14365/Dummy-1 ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.database_mongo for target module <module 'pymongo.mongo_client' from '/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.pyc'>
    2015-09-06 19:43:38,671 (14365/Dummy-1 ) tingyun.embattle.inspection 144 INFO - Detect hooker tingyun.armoury.database_mongo for target module <module 'pymongo.connection' from '/usr/local/lib/python2.7/dist-packages/pymongo/connection.pyc'>
    

    程序的配置文件在/tmp/tingyun.ini, 可以修改配置.

    查看监控结果

    探针会尝试与听云服务器建立连接,然后上传监控数据。

    应用拓扑:
    所谓应用拓扑借用了网络拓扑的概念,这里的节点就是应用,线就是应用之间的调用关系
    topo

    在情报汇总页面里给出了一些基本监控数据的汇总显示,下面举例说明:

    应用服务器响应时间画出了当前几个应用的响应时间。

    Apdex 指标
    什么是 Apdex? Apdex是 Application Performance Index 的简称.
    是一个由众多网络分析技术公司和测量工业组成的联盟组织联合起来开发的. Apdex 用一句话来概括,就是用户对应用性能满意度的量化值。
    它提供了一个统一的测量和报告用户体验的方法,第一次把最终用户的体验和应用性能联系在了一起。具体内容请参考维基百科.

    如图所示, 1 代表了所有用户都满意,因为所有的访问都是成功的, 容忍样本和失望样本都是 0. 所以总的 Apdex 指数就是 1.

    Apdex 指标
    Apdex full

    响应时间和吞吐率. 坐标纵轴左边 rpm 代表吞吐量,右边代表响应时间.
    响应时间和吞吐率

    一些数据库的监控数据

    最耗时的 SQL 操作.
    SQL

    输入图片说明

    输入图片说明

    下面是对于 mongodb 和 Memcached 的吞吐率堆叠图.
    输入图片说明

    输入图片说明

    对于服务器资源的监控

    听云也提供了对服务器 CPU 和内存等资源的监控, 这些是传统网络和设备监控的内容,把它们放到应用监控里,对于我们了解应用对物理资源的占用情况提供了数据
    支撑.
    输入图片说明

    对于 Web 应用过程的监控

    这个对于 web 执行的过程分析非常有帮助,会帮你列出来哪些代码调用是费时的,它的性能,调用次数等等.
    web

    总结和建议

    总体来说,虽然处于测试阶段,听云的这种基于云的应用监控服务做的还是不错的,所提供的数据对于我们了解自己的应用的运行情况起到了很大得帮助。
    笔者并没有全部展现其功能,更多的细节有待日后挖掘,特别是各个监控数据是如何取到的. 感兴趣的童鞋可以阅读其 Python 探针的源码,来了解其背后的原理和过程。

    意见建议:

    • 对于界面操作,有一个问题就是只能禁用而不能删除监控的应用,这个期望后期能做出改善.
    • 另外对于服务器资源的监控已经涉及到 CPU 和内存.那么对于我们的 Django 服务上线对外提供服务以后,对服务器网卡设备 IO,硬盘容量 /IO 等的监控也是非常重要的内容.
    • agent-server 的云模式对于部分的企业网存在访问限制的问题,虽然我们有 https 的加密传输,但是部分企业网会限制内网数据向外网传输,说白了,就是对于安全性的顾虑,看看听云是否有解决方案.

    参考资料:

    1 条回复    2015-12-02 23:10:53 +08:00
    kang000feng
        1
    kang000feng  
       2015-12-02 23:10:53 +08:00
    请问我 django 部署在 openshift paas 平台上,是否需要做端口绑定?
    在 SSH 终端执行 python manage.py runserver ,出现错误 You don't have permission to access that port.
    Performing system checks...

    System check identified no issues (0 silenced).
    October 04, 2015 - 20:56:45
    Django version 1.8.2, using settings 'mysite.settings'
    Starting development server at http://127.0.0.1:8000/
    Quit the server with CTRL-BREAK.

    Error: You don't have permission to access that port.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:41 · PVG 17:41 · LAX 01:41 · JFK 04:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.