电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

記一次django內存異常排查及解決方法

瀏覽:130日期:2024-09-24 08:18:01

起因

Django 作為 Python著名的Web框架,相信很多人都在用,自己工作中也有項目項目在用,而在最近幾天的使用中發現,部署Django程序的服務器出現了內存問題,現象就是運行一段時間之后,內存占用非常高,最終會把服務器的內存耗盡,對于Python項目出現內存問題,自己之前處理過一次,所以并沒有第一次解決時的慌張,自己之前把解決方法也整理了:https://www.jb51.net/article/151604.htm

但是事情似乎并沒有我想的那么簡單,自己嘗試用之前的的方法tracemalloc庫進行問題的排查,但是問題來了實際的項目中有快一百多個接口,怎么排查?難道一個一個接口進行測試排查,但是時間又比較緊急,可能又來不及了。對比上次自己解決是因為上次的項目比較簡單,相對來說定位問題比較容易,那么這次怎么處理呢?

處理過程

一般Python項目其實是很少出現內存問題的,一般都是自己代碼寫的有問題導致的,而對于這次出現的問題,自己的排查思路(對于web 接口類型的項目):

先排查調用比較頻繁的接口 然后排查數據匯總接口(查詢比較復雜) 如果上述還沒有查出來,再排查剩余的接口

在這次的問題排查中,自己大致也是按照這個思路進行的,在對調用頻繁的接口進行排查時,并沒有發現內存的異常,而出現內存的問題則是在數據匯總的相關接口上。

其實這種接口對于初級開發可能是容易出問題的地方,首先這種接口查詢的數據相對其他接口會比較復雜,如果編碼基礎又不是特別好,可能就會在這些接口上出現bug.

而在這次的排查中,最終確定是在一個匯總數據的接口上,定位到問題處在了Django ORM 使用不當導致的。自己通過一個簡單代碼實例來說明:

class Student(models.Model): name = models.CharField(max_length=20) name2 = models.CharField(max_length=20) name3 = models.CharField(max_length=20) name4 = models.CharField(max_length=20) name5 = models.CharField(max_length=20) name6 = models.CharField(max_length=20) name7 = models.CharField(max_length=20) name8 = models.CharField(max_length=20) name9 = models.CharField(max_length=20) name10 = models.CharField(max_length=20) name11 = models.CharField(max_length=20) name12 = models.CharField(max_length=20) name13 = models.CharField(max_length=20) name14 = models.CharField(max_length=20) name15 = models.CharField(max_length=20) age = models.IntegerField(default=0)

正常情況,我們的表字段會比較多,這里就通過多個name來模擬,出現題的代碼就出在關于這個表的接口上:

def index(request): studets = Student.objects.filter(age__gt=20) if studets: pass return HttpResponse('test memory')

為了讓內存問題容易復現,我通過腳本向Student中插入了20000條數據,當然這里數據越多,問題越明顯

通過一個測試腳本并發請求這個接口,觀察內存情況,你會發現,內存會出現瞬間上漲的情況,并且如果你的數據越多,請求越多,你的內存可能會在一段時間居高不下,并且逐漸上漲。問題出在哪里了?

其實很簡單,問題出在了代碼中的if 判斷那里,我們通過filter 查詢返回的是QuerySet 類型的數據,而我們過濾之后的數據可能會存在非常多的時候,這個時候我們通過if 直接判斷,自己的理解這個地方會將整個QuerySet加載到內存中,從而出現內存占用過高的問題,而如果并且這個時候這個接口的響應速度也是非常會變慢,而這個QuerySet 中的數據越多,內存占用越明顯。

在Django的文檔中其實做了說明

exists()¶Returns True if the QuerySet contains any results, and False if not. This tries to perform the query in the simplest and fastest way possible, but it does execute nearly the same query as a normal QuerySet query.

exists() is useful for searches relating to both object membership in a QuerySet and to the existence of any objects in a QuerySet, particularly in the context of a large QuerySet.

The most efficient method of finding whether a model with a unique field (e.g. primary_key) is a member of a QuerySet is:

entry = Entry.objects.get(pk=123)if some_queryset.filter(pk=entry.pk).exists(): print('Entry contained in queryset')

Which will be faster than the following which requires evaluating and iterating through the entire queryset:

if entry in some_queryset: print('Entry contained in QuerySet')

And to find whether a queryset contains any items:

if some_queryset.exists(): print('There is at least one object in some_queryset')

Which will be faster than:

if some_queryset: print('There is at least one object in some_queryset')

… but not by a large degree (hence needing a large queryset for efficiency gains).

Additionally, if a some_queryset has not yet been evaluated, but you know that it will be at some point, then using some_queryset.exists() will do more overall work (one query for the existence check plus an extra one to later retrieve the results) than using bool(some_queryset), which retrieves the results and then checks if any were returned.

所以對于我們的代碼我們只需要把if 判斷地方改成if not studets.exists() 就可以解決問題。

這是一個很小的知識點,但是如果使用不對,可能就會造成非常嚴重的內存問題。

總結

除了單元測試,還需要做大數據量測試,這次的問題如果在測試的時候做過一定數據量的測試,可能很早就能及時發現

問題

對于基礎的庫的使用要更加熟悉

排查問題的思路要明確,不然可能會無從下手

延伸閱讀

https://docs.djangoproject.com/en/3.0/ref/models/querysets/ https://www.jb51.net/article/151604.htm

到此這篇關于django內存異常排查及解決方法的文章就介紹到這了,更多相關django內存異常排查內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
主站蜘蛛池模板: 食品机械专用传感器-落料放大器-低价接近开关-菲德自控技术(天津)有限公司 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | COD分析仪|氨氮分析仪|总磷分析仪|总氮分析仪-圣湖Greatlake | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 凝胶成像仪,化学发光凝胶成像系统,凝胶成像分析系统-上海培清科技有限公司 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 软启动器-上海能曼电气有限公司 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 【星耀裂变】_企微SCRM_任务宝_视频号分销裂变_企业微信裂变增长_私域流量_裂变营销 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 混合气体腐蚀试验箱_盐雾/硫化氢/气体腐蚀试验箱厂家-北京中科博达 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 深圳市超时尚职业培训学校,培训:月嫂,育婴,养老,家政;化妆,美容,美发,美甲. | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 广州番禺搬家公司_天河黄埔搬家公司_企业工厂搬迁_日式搬家_广州搬家公司_厚道搬迁搬家公司 | 木材烘干机,木炭烘干机,纸管/佛香烘干设备-河南蓝天机械制造有限公司 | 螺钉式热电偶_便携式温度传感器_压簧式热电偶|无锡联泰仪表有限公司|首页 | 高通量组织研磨仪-多样品组织研磨仪-全自动组织研磨仪-研磨者科技(广州)有限公司 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 周口市风机厂,周鼓风机,河南省周口市风机厂 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 铝合金风口-玻璃钢轴流风机-玻璃钢屋顶风机-德州东润空调设备有限公司 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 储能预警-储能消防系统-电池舱自动灭火装置-四川千页科技股份有限公司官网 | 贵阳用友软件,贵州财务软件,贵阳ERP软件_贵州优智信息技术有限公司 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 空心明胶胶囊|植物胶囊|清真胶囊|浙江绿键胶囊有限公司欢迎您! | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 执业药师报名条件,考试时间,考试真题,报名入口—首页 | 塑料瓶罐_食品塑料瓶_保健品塑料瓶_调味品塑料瓶–东莞市富慷塑料制品有限公司 | 油漆辅料厂家_阴阳脚线_艺术漆厂家_内外墙涂料施工_乳胶漆专用防霉腻子粉_轻质粉刷石膏-魔法涂涂 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 海外仓系统|国际货代系统|退货换标系统|WMS仓储系统|海豚云 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 昆明化妆培训-纹绣美甲-美容美牙培训-昆明博澜培训学校 | app开发|app开发公司|小程序开发|物联网开发||北京网站制作|--前潮网络 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 |