MySQL terus menggantung (kueri macet saat mengirim data)

10

Saya memiliki situasi berikut:

Sekitar 5 kali seminggu (tidak terkait dengan situasi tertentu seperti cache kosong, lonjakan lalu lintas) beberapa permintaan macet saat mengirim data ( 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

kedua:

> 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

Pertanyaan ini terkait dengan menghasilkan menu navigasi. Mereka berjalan tanpa masalah dan sangat cepat sepanjang waktu.

Beberapa kali dalam sebulan beberapa pertanyaan lain macet pada data seding atau menunggu kunci tabel:

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`)

(terkait pencarian)

Informasi tambahan:

  • core_url_rewrite - Catatan 3M (30 situs web, 100k produk)
  • catalog_category_flat_store_ * - 2000 catatan (penggunaan kategori datar diaktifkan)

Ini berjalan pada pengaturan menggunakan vmware pada beberapa perangkat keras besar (master mysql memiliki 8 core dialokasikan dan 64GB RAM, disk SSD pada penyimpanan SAN), mysql dioptimalkan dan dimonitor secara terus menerus. Ada beberapa masalah di masa lalu terkait dengan I / O (beberapa mengeluarkan dengan tautan antara server dan penyimpanan SAN).

Kami tidak dapat menemukan masalah karena menjalankan dengan menggunakan bare metal (tanpa virtualisasi, konfigurasi yang sama) ini tidak pernah terjadi, dalam kondisi tekanan tinggi (menjalankan skenario pengepungan + pengujian beban, tanpa cache).

Adakah yang mengalami masalah serupa?

MEMPERBARUI:

reindexSemua pencarian dipindahkan ke tabel sementara (sehingga tidak mengunci tabel utama yang digunakan oleh produksi, lalu mengganti nama tabel tmp). Jadi, proses pengindeksan ulang tidak mengganggu pengunjung yang mencari situs web. https://github.com/magendooro/magento-fulltext-reindex kudos to carco

FlorinelChis
sumber
Apakah Anda yakin, mereka berlari cepat? Alternatifnya mungkin menu navigasi di-cache. Afaik adalah penggunaan indeks tidak mudah karena, tidak ada indeks lebih dari Category_ud, is_system dan path. Dan path adalah SEPERTI, jadi MySQL memiliki masalah nyata di sini. Saya bukan db ekspor btw ;-) Hanya 2 sen
Fabian Blechschmidt
1
yang pilih berjalan di bawah 1s. pertanyaan terus menumpuk ketika yang pertama tetap dalam mengirim data ...
FlorinelChis
1
FWIW saya telah melihat masalah yang sama.
philwinkle
@ philwinkle bagaimana pengaturan pencarian Anda? teks lengkap?
FlorinelChis
1
github.com/magendooro/magento-fulltext-reindex ini membantu kami dan memutuskan untuk menerbitkan kode sumber.
FlorinelChis

Jawaban:

4

Sepertinya bug inti / regresi yang kita lihat di 1.7 di mana blok dan cache pengumpulan tidak berfungsi secara efektif untuk menu navigasi ( catalog/navigation/top.phtml).

Anda dapat menguji dengan menghapusnya, atau hanya menangkap sementara output ke file dengan ob_startdan menyajikannya dari file statis / memcache.

Juga, perangkat keras yang Anda gunakan tidak terdengar besar dan terlihat di bawah yang ditentukan untuk ukuran toko yang Anda miliki. Mungkin ada hambatan I / O di sana juga - Penyimpanan SAN + jaringan padat = kinerja buruk.

-

Sebagai solusi kasar, Anda dapat menyesuaikan kelas blok untuk navigasi (dump get_class($this)) top.phtmluntuk mengidentifikasinya.

Ini akan memungkinkan caching di seluruh situs, tanpa caching level kategori yang dipanggil oleh versi baru. Layak juga menghapus is_activekelas dari renderer pohon jika Anda melakukan ini untuk menghindari item menu acak yang muncul dipilih (dan mengimplementasikan alternatif JS sebagai gantinya).

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;
}
Ben Lessani - Sonassi
sumber
kami sebelumnya mengalokasikan 32 core dan 92Gb ram (dan mengubah konfigurasi mysql sesuai, hasil yang sama) - server memiliki 64 core dan 184 gb ram (itu sebabnya saya mengatakan itu besar) ... maaf, saya tidak menyebutkan itu Magento Enterprise 1.12. kami memantau lalu lintas jaringan tidak melihat apa pun yang mengarah ke kemacetan (kami memiliki masalah sebelumnya, konektor serat tidak berfungsi dengan baik, itu diganti).
FlorinelChis
Enterprise 1.12 adalah CE 1.7 - mereka adalah basis kode yang sama. Jadi bug akan mempengaruhi mereka berdua. Coba apa yang saya katakan (hard-code nav atas dan nonaktifkan kategori pada layered nav) dan Anda dapat mengonfirmasi. Lebih banyak perangkat keras tidak akan membuat perbedaan jika perangkat lunak tidak diatur dengan benar untuk menggunakannya.
Ben Lessani - Sonassi
Saya akan mengedit jawaban saya dan menambahkan beberapa kode hacky untuk Anda gunakan untuk mengonfirmasi
Ben Lessani - Sonassi
Ini adalah tempat yang baik untuk memulai, saya akan meletakkan sesuatu di tempatnya dan melihat apakah masih macet dalam 1 minggu :)
FlorinelChis
3

Ganti fungsi di

app / code / core / Mage / Katalog / Helper / 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;
}
Matthias Jaekle
sumber
2

Dalam kasus kami, ini mengarah ke permintaan lambat ini:

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')

dari app / code / core / Mage / Sitemap / Model / Sumber Daya / Katalog / Product.php .

Itu hang karena pernyataan category_id IS NULL . MySQL karena alasan tertentu tidak menggunakan indeks.

Menghapus category_id IS NULL dan mengatur id_path REGEXP '^ product / [0-9] + $' memperbaiki masalah.

Salin aplikasi / kode / inti / Penyihir / Katalog / Pembantu / Produk / Url / Rewrite.php ke aplikasi / kode / lokal / Penyihir / Katalog / Pembantu / Produk / Url / Rewrite.php dan tambahkan fungsi ini:

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;
}

Kemudian salin aplikasi / kode / inti / Penyihir / Peta Situs / Model / Sumber Daya / Katalog / Product.php ke aplikasi / kode / lokal / Penyihir / Peta Situs / Model / Sumber Daya / Katalog / Product.php dan ubah baris 72 ke:

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

Awalnya diambil dari https://www.goivvy.com/blog/solved-magento-stuck-generating-google-sitemap-large-website

Konstantin Gerasimov
sumber