1

我有 symfony2 应用程序。但是我们有 RAM 内存问题......当有 50 个活跃的人时,它就像一个魅力(谷歌分析)。

我通常像这样从数据库中选择数据:

        $qb=$this->createQueryBuilder('s')
         ->addSelect('u')
         ->where('s.user = :user')
         ->andWhere('s.admin_status = false')
         ->andWhere('s.typ_statusu != :group')
         ->setParameter('user', $user)
         ->setParameter('group', 'group')
         ->innerJoin('s.user', 'u')               
         ->orderBy('s.time', 'DESC')
         ->setMaxResults(15);

 return $query=$qb->getQuery()->getResult();

查询很快,我对它们没有问题。

请让我确切地知道您需要什么,我会将其粘贴在这里。我需要修复它这么多..

但是现在问题来了:当同时有 470 人时......(谷歌分析)大约有 7GB 的内存......然后在达到峰值后下降到 5GB。但为什么这么多???我的脚本在 app_dev 中占用了 10-17MB 的内存。

我也使用 APC。我该如何解决这种情况?为什么会消耗这么多内存?谢谢任何建议!

你的平均记忆力是多少?

顺便说一句:当我不解决这个问题时,我会遇到大麻烦。

4

5 回答 5

1

我怀疑您的页面有不止一个查询。页面上发生了多少查询?该学说中最糟糕的事情是能够通过 getter 进行查询(例如 getComments())。如果您使用的是多对多关系,这会导致巨大的问题。您可以在开发环境中通过分析器查看所有查询。

也可能是apache或php设置中的问题。php-fpm 的错误设置也会导致问题。最好的解决方案是使用siege等工具对服务器进行压力测试,并查看 htop 或 top 发生了什么。300 人对于“赤裸”的 apache 来说可能是一个沉重的负担

于 2013-05-10T08:55:01.817 回答
1

确保您正确理解内存消耗。http://blog.scoutapp.com/articles/2010/10/06/determining-free-memory-on-linux

要快速 Apc,您可以删除修改后的检查,apc.stat = 0但每次修改现有文件时都需要清除 apc-cache:http://www.php.net/manual/en/apc.configuration.php#ini.apc。统计

为了减少内存消耗,减少水合作用,我->select('x')只添加和获取必要的内容。

要优化内存消耗,请启用 mysql-cache,例如 /etc/mysql/my.cnf:

query_cache_size=128M
query_cache_limit=1M

不要忘记启用并检查您的慢查询日志以避免瓶颈。

于 2013-05-09T16:05:22.627 回答
1

将脚本的最大执行时间设置为仅 30 秒:

max_execution_time = 30

将 APC shm_size 设置为与您的内存相比合理的值:

apc.shm_size = 256M

然后优化您的查询。如果你在 cli 中使用 php/symfony,你最好也限制 cli 中 php 的资源使用。

于 2013-05-05T01:05:32.040 回答
1

一个问题可能是教义,如果您在每个请求中都添加了太多的对象。

于 2013-05-04T19:12:26.393 回答
1

您是否尝试过检索标量结果而不是对象集合?

// [...]
return $query=$qb->getQuery()->getScalarResult();

http://docs.doctrine-project.org/en/latest/reference/query-builder.html#executing-a-query http://doctrine-orm.readthedocs.org/en/2.0.x/reference/dql -doctrine-query-language.html#query-result-formats

在 symfony 配置级别,您是否仔细检查了您的配置以确保已正确启用缓存?

http://symfony.com/doc/current/reference/configuration/doctrine.html#caching-drivers

根据您的整体流程,从您的实体管理器中分离实体可能会很有用:

http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#detaching-entities

于 2013-05-13T21:45:55.720 回答