MySQL askıda kalmaya devam ediyor (veri göndermede sıkışmış sorgular)


10

Aşağıdaki durumlarım var:

Haftada yaklaşık 5 kez (önbellek temizliği, trafik artışı gibi belirli bir durumla ilgili değildir) bazı sorgular veri gönderme konusunda sıkışır ( show processlist):

>     SELECT `main_table`.`entity_id`, `main_table`.`level`, `main_table`.`path`, `main_table`.`position`,
> `main_table`.`is_active`, `main_table`.`is_anchor`,
> `main_table`.`name`, `url_rewrite`.`request_path` FROM
> `catalog_category_flat_store_30` AS `main_table`
>      LEFT JOIN `core_url_rewrite` AS `url_rewrite` ON url_rewrite.category_id=main_table.entity_id AND
> url_rewrite.is_system=1 AND url_rewrite.product_id IS NULL AND
> url_rewrite.store_id='30' AND url_rewrite.id_path LIKE 'category/%'
> WHERE (path LIKE '1/2/%') AND (main_table.store_id = '30') AND
> (is_active = '1') AND (include_in_menu = '1') ORDER BY name ASC

ikinci:

> SELECT `main_table`.`entity_id`, main_table.`name`, main_table.`path`,
> `main_table`.`is_active`, `main_table`.`is_anchor`,
> `main_table`.`manually`, `url_rewrite`.`request_path` FROM
> `catalog_category_flat_store_10` AS `main_table`  LEFT JOIN
> `core_url_rewrite` AS `url_rewrite` ON
> url_rewrite.category_id=main_table.entity_id AND
> url_rewrite.is_system=1 AND url_rewrite.product_id IS NULL AND
> url_rewrite.store_id='10' AND url_rewrite.id_path LIKE 'category/%'
> WHERE (main_table.is_active = '1') AND (main_table.include_in_menu =
> '1') AND (main_table.path like '1/2/1528/1569/%') AND (`level` <= 4)
> ORDER BY `main_table`.`position` ASC

Bu sorgular gezinme menüsünün oluşturulmasıyla ilgilidir. Onlar sorunsuz ve her zaman çok hızlı çalışır.

Ayda birkaç kez, diğer bazı sorgular veri ekleme veya tablo kilidini beklemeye yapışır:

INSERT INTO `catalogsearch_result` SELECT 316598 AS `query_id`, `s`.`product_id`, MATCH (s.data_index) AGAINST ('STRING HERE' IN BOOLEAN MODE) AS `relevance` FROM `catalogsearch_fulltext` AS `s`
INNER JOIN `catalog_product_entity` AS `e` ON e.entity_id = s.product_id WHERE (s.store_id = 38) AND (MATCH (s.data_index) AGAINST ('STRING HERE' IN BOOLEAN MODE)) ON DUPLICATE KEY UPDATE `relevance` = VALUES(`relevance`)

(arama ile ilgili)

İlave bilgi:

  • core_url_rewrite - 3M kayıtları (30 web sitesi, 100 bin ürün)
  • catalog_category_flat_store_ * - 2000 kayıt (düz kategorileri kullan etkin)

Bu, bazı büyük donanımlarda (mysql master'ın 8 çekirdeği ve 64GB RAM, SAN depolama birimindeki SSD diskleri) vmware kullanılarak bir kurulumda çalışıyor, mysql optimize edildi ve sürekli olarak izlendi. Geçmişte G / Ç ile ilgili bazı sorunlar vardı (bazıları sunucular ve SAN depolama birimi arasındaki bağlantıyla ilgilidir).

Çıplak metal üzerinde çalışırken (sanallaştırma yok, aynı yapılandırma) yüksek stres koşullarında (kuşatma + yük testi senaryoları çalışıyor, önbellek yok) bu sorunu asla tespit edemedik.

Başka benzer sorunları olan var mı?

GÜNCELLEME:

reindexTüm arama geçici bir tabloya taşındı (böylece üretim tarafından kullanılan ana tabloyu kilitlemez, ardından tmp tablosunu yeniden adlandırır). Dolayısıyla, reindex işlemi web sitesinde arama yapan ziyaretçileri etkilemez. https://github.com/magendooro/magento-fulltext-reindex kudos to carco


Hızlı koştuğundan emin misin? Alternatif olarak, gezinme menüsü önbelleğe alınmış olabilir. Afaik, index_ud, is_system ve path üzerinde bir dizin olmadığı için bir endeksin kullanımı kolay değildir. Ve yol bir GİBİ, bu yüzden MySQL burada gerçek bir sorun afaik var. Ben hiç db export btw ;-) Sadece 2 cent
Fabian Blechschmidt

1
Bu seçim 1 saniyenin altında çalışır. ilk veri gönderme kaldığında sorguları yığılmaya devam ...
FlorinelChis

1
FWIW Aynı sorunu gördüm.
philwinkle

@philwinkle arama kurulumunuz nasıl? tam metin?
FlorinelChis

1
github.com/magendooro/magento-fulltext-reindex bu bize yardımcı oldu ve kaynak kodunu yayınlamaya karar verdi.
FlorinelChis

Yanıtlar:


4

Blok ve toplama önbelleğinin gezinme menüsü ( catalog/navigation/top.phtml) için etkili bir şekilde çalışmadığı 1.7'de gördüğümüz çekirdek bir hata / regresyona benziyor .

Bunu kaldırarak test edebilir veya çıktıyı geçici olarak bir dosyaya yakalayabilir ve ob_startstatik bir dosyadan / memcache'den sunabilirsiniz.

Ayrıca, kullandığınız donanım çok büyük gelmiyor ve mağazanızın boyutu için aşağıda belirtilmiş görünüyor. Muhtemelen orada bir G / Ç darboğazı var - SAN depolama + sıkışık ağ = düşük performans.

-

Ham bir çözüm olarak, navigasyonun (dump get_class($this)) blok sınıfını top.phtmltanımlamak için ayarlayabilirsiniz .

Bu, yeni sürümün çağırdığı kategori düzeyinde önbellekleme olmadan site genelinde önbelleğe almayı sağlar. Ayrıca, is_activerastgele menü öğelerinin seçili görünmesini (ve bunun yerine bir JS alternatifini uygulamak) önlemek için bunu ağaç oluşturucusundan sınıf kaldırmaya değer .

public function getCacheTags()
{
  return parent::getCacheTags();
}
public function getCacheLifetime()
{
  return null;
}
public function getCacheKey()
{
  return parent::getCacheKey();
}
public function getCacheKeyInfo()
{
  $shortCacheId = array(
    'CATALOG_NAVIGATION',
    Mage::app()->getStore()->getId(),
    Mage::getDesign()->getPackageName(),
    Mage::getDesign()->getTheme('template'),
    Mage::getSingleton('customer/session')->getCustomerGroupId(),
    'template' => $this->getTemplate(),
    'name' => $this->getNameInLayout(),
  );
  $cacheId = $shortCacheId;
  $shortCacheId = array_values($shortCacheId);
  $shortCacheId = implode('|', $shortCacheId);
  $shortCacheId = md5($shortCacheId);
  $cacheId['short_cache_id'] = $shortCacheId;
  return $cacheId;
}

Daha önce 32 çekirdek ve 92Gb ram tahsis ettik (ve mysql yapılandırmasını buna göre değiştirdik, aynı sonuç) - sunucunun 64 çekirdeği ve 184 gb ram'ı var (bu yüzden çok büyük olduğunu söyledim) ... üzgünüm, bahsetmedim Magento Enterprise 1.12. ağ trafiğinin bir darboğa işaret eden bir şey görmediğini izledik (daha önce bir sorun vardı, fiber konektör düzgün çalışmıyor, değiştirildi).
FlorinelChis

Kurumsal 1.12 CE 1.7'dir - aynı kod tabanlıdır. Böylece hata her ikisini de etkileyecektir. Ne dediğimi deneyin (üst nav'ı sabit kodlayın ve katmanlı nav'da kategorileri devre dışı bırakın) ve onaylayabilirsiniz. Yazılım kullanmak için doğru şekilde ayarlanmamışsa, daha fazla donanım bir fark yaratmaz.
Ben Lessani - Sonassi

Cevabımı düzenleyeceğim ve onaylamak için kullanacağınız bazı hileli kod ekleyeceğim
Ben Lessani - Sonassi

Başlamak için iyi bir yer, bir şey yerleştirip 1 hafta içinde hala çöküp
düşmediğini

3

İşlevini değiştir

Uygulama / kod / çekirdek / Mage / Katalog / Yardımcı / Kategori / URL / Rewrite.php:

/**
* Join url rewrite to select
*
* @param Varien_Db_Select $select
* @param int $storeId
* @return Mage_Catalog_Helper_Category_Url_Rewrite
*/
public function joinTableToSelect(Varien_Db_Select $select, $storeId)
{
$select->joinLeft(
array('url_rewrite' => $this->_resource->getTableName('core/url_rewrite')),
'url_rewrite.category_id=main_table.entity_id'
);
$select->where('url_rewrite.is_system = ?', '1');
$select->where($this->_connection->quoteInto('url_rewrite.store_id = ?', (int)$storeId));
$select->where($this->_connection->prepareSqlCondition('url_rewrite.id_path', array('like' => 'category/%')));
$select->where('request_path = url_rewrite.request_path');

return $this;
}

2

Bizim durumumuzda bu yavaş sorguya indi:

SELECT `main_table`.`entity_id`
      , `url_rewrite`.`request_path`
FROM `catalog_product_entity` AS `main_table` 
INNER JOIN `catalog_product_website` AS `w`
   ON main_table.entity_id = w.product_id 
LEFT JOIN `core_url_rewrite` AS `url_rewrite`
   ON url_rewrite.product_id = main_table.entity_id
   AND url_rewrite.is_system = 1
   AND url_rewrite.category_id IS NULL
   AND url_rewrite.store_id = 1
   AND url_rewrite.id_path LIKE 'product/%'
WHERE (w.website_id='1')

gelen uygulama / kod / çekirdek / Mage / haritası / Model / kaynak / Katalog / product.php .

Category_id IS NULL deyimi nedeniyle kilitleniyor . MySQL nedense bir indeks kullanmıyordu.

Category_id öğesini kaldırmak NULL ve id_path REGEXP '^ product / [0-9] + $' ayarını yapmak sorunu çözdü.

Kopya uygulaması / kod / çekirdek / Büyücü / Katalog / Yardımcı / Ürün / URL / Rewrite.php için app / kod / yerel / Büyücü / Katalog / Yardımcı / Ürün / URL / Rewrite.php ve bu işlevi ekleyin:

public function joinTableToSelectPatch(Varien_Db_Select $select, $storeId)
{ 
$select->joinLeft(
    array('url_rewrite' => $this->_resource->getTableName('core/url_rewrite')),
    'url_rewrite.product_id = main_table.entity_id AND url_rewrite.is_system = 1 AND ' .
        $this->_connection->quoteInto('url_rewrite.store_id = ? AND ',
            (int)$storeId) .
        $this->_connection->prepareSqlCondition('url_rewrite.id_path', array('regexp' => '^product/[0-9]+$')),
    array('request_path' => 'url_rewrite.request_path'));
return $this;
}

Sonra kopya uygulaması / kod / çekirdek / Büyücü / site haritası / Model / Kaynak / Katalog / product.php için app / kod / yerel / Büyücü / site haritası / Model / Kaynak / Katalog / product.php ve değişim hattına 72:

$urlRewrite->joinTableToSelectPatch($this->_select, $storeId);

Başlangıçta https://www.goivvy.com/blog/solved-magento-stuck-generating-google-sitemap-large-website adresinden alınmıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.