在 ramdrive 上运行 django test /w postgresql 没有看到性能提升

Posted

技术标签:

【中文标题】在 ramdrive 上运行 django test /w postgresql 没有看到性能提升【英文标题】:Not seeing performance increase running django test /w postgresql on ramdrive 【发布时间】:2017-07-26 13:56:23 【问题描述】:

对于 django 项目,随着模型的增长和迁移次数的增加,测试的运行速度越来越慢。我现在计时的单个单元测试时间为 200 秒。

我关注了这篇文章:http://tech.marksblogg.com/test-django-on-ram-drive.html 只为测试而在 ramdrive 上工作,但奇怪的是我没有看到任何改进......所以我预计事情不会像它应该的那样......

我已经调试了一些,并且确实看到了针对 postgres 生成的 TABLESPACE 语句,例如:

... CREATE TABLE ""django_content_type"" (""id"" serial NOT NULL PRIMARY KEY USING INDEX TABLESPACE ""ram_disk"", ""name"" varchar(100) NOT NULL, ""app_label"" varchar(100) NOT NULL, ""model"" varchar(100) NOT NULL) TABLESPACE ""ram_disk""",,,,,,,,,"

会不会是postgresql拒绝了?我如何测试/查看内存驱动器是否实际被使用?

保罗

【问题讨论】:

你检查过 Postgres 查询日志吗? 该博客中给出的建议非常可怕。不要那样做。见***.com/q/9407442/398670 【参考方案1】:

该博客中给出的建议非常糟糕。不要那样做。如果您的数据库中还有其他您关心的内容,这不仅不安全,而且它也不会解决 WAL 和 fsync 成本,因此它甚至不会那么快。

ramdisk 对现代虚拟内存系统几乎没有好处。您最好还是照常使用 postgres,并关闭持久性保护以进行测试。

有关这方面的提示,请参阅 Optimise PostgreSQL for fast testing。

如果您出于某种原因必须使用 ramdisk / tempfs,initdb 在您启动系统时会在那里创建一个全新的 postgres 实例。你会得到更好的结果,而且更安全。

【讨论】:

【参考方案2】:

感谢您的链接。

我真的不需要 ramdrive,我只是渴望在运行测试时提高性能。

关闭 fsync=off 和 full_page_writes 对性能影响不大:

python manage.py test -v3 --noinput 192,49s user 0,69s system 92% cpu 3:28,44 total

对比

python manage.py test -v3 --noinput 200,73s user 0,71s system 94% cpu 3:32,38 total

我认为实际上是我的 ssd 驱动程序似乎越来越慢?在关于 ramdrive 的帖子中,有一个简单的性能检查,当我在我的 ssd 上运行时:

dd if=/dev/zero \
  of=/tmp/benchmark \
  conv=fdatasync \
  bs=4k \
  count=100000 \
  && rm -f /tmp/benchmark

409600000 字节 (410 MB) 已复制,11,6737 秒,35,1 MB/秒

与针对 ram 驱动程序的相同测试:

409600000 字节 (410 MB) 已复制,0.16099 秒,2.5 GB/秒

实际上我希望超过 35MB/s....

也可能是 ubuntu/驱动程序问题?

保罗

【讨论】:

以上是关于在 ramdrive 上运行 django test /w postgresql 没有看到性能提升的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 django 网站上记录服务器错误

django——路由

我无法在 Django 中将图像加载到我的页面。啥都试过

如何在 DJango 中将 RawQuerySet 结果作为 JSONResponse 传递?

Django 模板和变量属性

获取 django 在 postgresql 上运行的所有查询