为了性能优化,可以绕过模型层的哪些部分


28

我目前看到的是,对于具有非常简单架构(大约5个字段)的数据库表,它以大约50次插入/秒的速率在我的本地开发环境(SSD驱动器)中插入新记录-这就是模型上没有观察者来填充关联表。

使用直接SQL,我看到了很大的改进-每秒大约1800次插入。我们正在考虑尝试优化模型的性能,但是我们当然不希望失去Magento核心为我们提供的所有出色的稳定性和灵活性。

我想知道是否有人以前走过这条路线,以及是否存在可以相对安全地绕过模型层的组件方面的轻松之举,从而可以显着提高性能。

像:

  • 类名解析
  • 保存事件之前和之后
  • 活动派遣
  • 交易次数
  • 等等

更新:我撒谎,实际上有一些其他查询是从观察者或afterSave()触发的,当我检查数据库查询日志时会看到这些查询。使用Magento模型对一个完全简单的实体进行基准测试实际上可以使我获得〜300行/秒的速度-事务只有MySQL开销。


1
您是否尝试过重用模型对象来写入数据?即清除它,setData然后保存。这样可以避免调用getModel和PHP固有的对象实例化开销。
davidalger

另外,我会猜测这里的瓶颈在您的CPU中,而不是驱动器中……因为所有必要的代码文件都会在第一次通过时加载。
davidalger

谢谢大卫!我也会尝试的。实际上,我认为我们仍然受到正在执行的查询数量的I / O限制。对于给定的模型保存,我们大约有20条查询正在运行-我们需要保留其中一些查询(填充关联表,在保存之前选择SELECT以检查是否存在),而其他一些我们可以删除的查询(外部会话保存,额外的负载) ()可以在应用程序逻辑中避免)
kalenjordan

您可以轻松找出答案。将整个根目录和MySQL DB挂载到RAM磁盘上。但是我强烈怀疑I / O是服务器级设备中的问题。您可能会发现仅禁用“保存时索引”会带来更多好处。
Ben Lessani-Sonassi

Answers:


17

可以加快整个网站速度的一件事是删除Varien_Profiler生产网站上的所有引用。即使禁用了探查器,它Varien_Profiler::也会始终检查是否启用了探查器,因此对的每次调用都会产生一条附加if语句。当然,删除所有这些调用将以无法再使用事件探查器为代价。但是,这可以使整个站点的速度提高5%左右(这是主观的体验,但是Varien_ProfilerMagento的呼叫很多。)我实际上写了一个小shell脚本来自动注释掉所有文件中的这些调用,明天我将在工作时准备好代码并将其添加到我的帖子中。

如现在所承诺的,将这些调用注释掉的代码:

grep -l "Varien_Profiler" * -R > profiler.txt 
for x in `cat profiler.txt` 
do 
sed -i '/Varien_Profiler/s/^/\/\//' $x
done

这应该在app /以及lib /文件夹的linux控制台中运行。之后,您可能需要手动调整文件/lib/Varien/Profiler.php。还请注意,在将其投入使用之前,您应该在安全的环境中对此进行彻底测试-但我想这应该很明显;)


哇!我从来没有想过禁用Varien_Profiler调用会带来接近5%的收益。我会检查一下,谢谢!
kalenjordan

@sparcksoft如所承诺的,我现在添加了代码。
mpaepper

1
这就是C预编译器条件非常好的地方。PHP没有它们是很糟糕的,但是,当然,这意味着它必须拥有自己的内置预编译和缓存方法。:)
davidalger 2013年

2
find . -type f -exec grep -qF 'Varien_Profiler' {} \; -exec sed -i '/Varien_Profiler/d' {} \;如果您喜欢快速的单件套,也可以编写它。
kojiro 2013年

14

在Magento模型上执行大量保存时,最好禁用Magento索引器,这会降低处理速度:

$processes = Mage::getSingleton('index/indexer')->getProcessesCollection();
$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_MANUAL));
$processes->walk('save');

完成后启用它:

$processes->walk('setMode', array(Mage_Index_Model_Process::MODE_REAL_TIME));
$processes->walk('save');

啊,很好。这样就好比您要保存大量的customer_entity记录并希望避免每次保存都发生客户索引编制一样吗?就我而言,我实际上是针对没有任何索引的自定义实体执行此操作的-至少对于我所做的基准测试而言是如此。我们也有一些自定义索引,我可能会在此技巧上使用它!
kalenjordan

我认为没有客户索引,但是在修改很多产品等时,它一定会对您有所帮助。无论哪种方式都值得尝试!
Rick Kuipers 2013年

抱歉,是的,例如EAV产品数据。谢谢。
kalenjordan

嘿! 之后,您可能需要(部分)重新索引?
亚历克斯

@Alex是,索引器将重置为MODE_REAL_TIME,因此它将按计划重新索引。当然,您可以根据需要强制执行此操作。
Rick Kuipers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.