MySQL लटकता रहता है (डेटा भेजने पर अटके प्रश्न)


10

मेरी निम्न स्थिति है:

सप्ताह में लगभग 5 बार (कैश स्पष्ट, ट्रैफ़िक स्पाइक जैसी किसी भी विशिष्ट स्थिति से संबंधित नहीं) कुछ प्रश्न डेटा भेजने पर अटक जाते हैं ( 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

दूसरा:

> 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

ये प्रश्न नेविगेशन मेनू को जनरेट करने से संबंधित हैं। वे बिना किसी मुद्दे के चलते हैं और हर समय बहुत तेज दौड़ते हैं।

महीने में कुछ बार कुछ अन्य क्वेरीज़ सेडिंग डेटा या टेबल लॉक के इंतज़ार में अटक जाती हैं:

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

(संबंधित खोज)

अतिरिक्त जानकारी:

  • core_url_rewrite - 3M रिकॉर्ड (30 वेबसाइट, 100k उत्पाद)
  • कैटलॉग_श्रेणी_फ्लैट_स्टोर_ * - 2000 रिकॉर्ड (फ्लैट श्रेणियों का उपयोग सक्षम है)

यह कुछ विशाल हार्डवेयर पर vmware का उपयोग करके एक सेटअप पर चल रहा है (mysql मास्टर को 8 कोर आवंटित किए गए हैं और 64 जीबी की रैम, SSD सैन स्टोरेज पर डिस्क), mysql को ऑप्टिमाइज़ किया गया था और लगातार निगरानी की जाती है। I / O से संबंधित अतीत में कुछ समस्याएँ थीं (कुछ सर्वर और सैन स्टोरेज के बीच लिंक के साथ कुछ शब्द हैं)।

हम इस मुद्दे को इंगित नहीं कर सकते क्योंकि नंगे धातु (कोई वर्चुअलाइजेशन, समान कॉन्फिगरेशन) पर चल रहा है, यह कभी भी उच्च तनाव की स्थिति में नहीं चलता है (घेराबंदी + लोड परीक्षण परिदृश्य, कोई कैश नहीं चल रहा है)।

किसी और के समान मुद्दे होने?

अपडेट करें:

reindexAll खोज को एक अस्थायी तालिका में ले जाया गया था (इसलिए यह उत्पादन द्वारा उपयोग की जाने वाली मुख्य तालिका को लॉक नहीं करता है, फिर टेबल्स तालिका का नाम बदल देता है)। इसलिए, रिइंडेक्स प्रक्रिया वेबसाइट पर खोज करने वाले आगंतुकों के साथ हस्तक्षेप नहीं करती है। https://github.com/magendooro/magento-fulltext-reindex kudos to carco


क्या आप निश्चित हैं, वे तेजी से भागे? वैकल्पिक हो सकता है कि नेविगेशन मेनू कैश्ड है। Afaik एक इंडेक्स का उपयोग आसान नहीं है, क्योंकि, category_ud, is_system और पाथ पर कोई इंडेक्स नहीं है। और रास्ता एक प्रकार का है, इसलिए MySQL यहाँ एक वास्तविक समस्या afaik है। मैं कोई DB निर्यात btw नहीं हूँ ;-) बस 2 सेंट
Fabian Blechschmidt

1
कि चयन 1s से कम में चलता है। जब डेटा भेजने में सबसे पहले सवाल आता है, तो सवाल उठते रहते हैं ...
फ्लोरिनसेल

1
FWIW मैं एक ही मुद्दा देखा है।
philwinkle

@philwinkle आपका खोज सेटअप कैसा है? पूर्ण पाठ?
फ्लोरिनसेलइस

1
github.com/magendooro/magento-fulltext-reindex इसने हमारी मदद की और स्रोत कोड प्रकाशित करने का निर्णय लिया।
फ्लोरिनसेल यह

जवाबों:


4

यह एक कोर बग / प्रतिगमन जैसा दिखता है जिसे हमने 1.7 में देखा था, जहां नेविगेशन मेनू ( catalog/navigation/top.phtml) के लिए ब्लॉक और संग्रह कैश प्रभावी रूप से काम नहीं कर रहे थे ।

आप इसे हटाकर परीक्षण कर सकते हैं, या बस अस्थायी रूप से आउटपुट को फ़ाइल में कैप्चर कर सकते हैं ob_startऔर इसे स्थैतिक फ़ाइल / मेमेचे से प्राप्त कर सकते हैं।

इसके अलावा, आपके द्वारा उपयोग किया जाने वाला हार्डवेयर बहुत बड़ा नहीं लगता है और आपके पास मौजूद स्टोर के आकार के लिए निर्दिष्ट होता है। शायद वहाँ भी एक I / O अड़चन है - सैन भंडारण + भीड़ नेटवर्क = खराब प्रदर्शन।

-

एक कच्चे समाधान के रूप में, आप इसे पहचानने के लिए नेविगेशन (डंप get_class($this)) के लिए ब्लॉक वर्ग को समायोजित कर सकते हैं top.phtml

यह साइट-स्तरीय कैशिंग की अनुमति देगा, बिना श्रेणी स्तर के कैशिंग के बिना जो नया संस्करण लागू किया गया है। इसके भी हटाने के लायक हैis_activeयदि आप ऐसा करते हैं कि आप रैंडम मेनू आइटम को चुनने से बचने के लिए ट्री रेंडरर से क्लास सकते हैं (और इसके बजाय JS विकल्प लागू करें)।

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

हमने पहले 32 कोर और 92 जीबी की रैम (और उसी के अनुसार mysql कॉन्फिगर को बदल दिया था) आवंटित किया था - सर्वर में 64 कोर और 184 जीबी रैम है (इसलिए मैं कह रहा था कि यह बहुत बड़ा है) ... क्षमा करें, मैंने उल्लेख नहीं किया है यह Magento Enterprise 1.12 है। हमने देखा कि नेटवर्क ट्रैफ़िक एक टोंटी की ओर इशारा करते हुए कुछ भी नहीं देखा (हम पहले एक मुद्दा था, फाइबर कनेक्टर ठीक से काम नहीं कर रहा था, इसे बदल दिया गया था)।
फ्लोरिनसेलइस

एंटरप्राइज 1.12 सीई 1.7 है - वे समान कोड आधार हैं। तो बग उन दोनों को प्रभावित करेगा। मैंने जो कहा था उसे आज़माएं (शीर्ष-नौसेना में हार्ड-कोड और स्तरित नौसेना पर श्रेणियों को अक्षम करें) और आप पुष्टि कर सकते हैं। यदि सॉफ़्टवेयर का उपयोग करने के लिए ठीक से सेट नहीं किया गया है, तो अधिक हार्डवेयर से कोई फर्क नहीं पड़ता है।
बेन लेसानी - सोनासी

मैं अपने उत्तर को संपादित करने और पुष्टि करने के लिए उपयोग करने के लिए कुछ हैकी कोड जोड़ने जा रहा हूं
बेन लेसानी - सोनासी

यह शुरू करने के लिए एक अच्छी जगह है, मैं जगह में कुछ डालूंगा और देखूंगा कि क्या यह अभी भी 1 सप्ताह के भीतर दुर्घटनाग्रस्त हो जाता है :)
फ्लोरिनेल

3

समारोह में बदलें

एप्लिकेशन / कोड / कोर / दाना / सूची / हेल्पर / श्रेणी / यूआरएल / 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

हमारे मामले में यह इस धीमी क्वेरी के लिए नीचे आया:

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

से एप्लिकेशन / कोड / कोर / दाना / साइटमैप / मॉडल / संसाधन / सूची / Product.php

यह IS_ NULL की श्रेणी के कारण लटका हुआ है स्टेटमेंट। किसी कारण के लिए MySQL एक सूचकांक का उपयोग नहीं किया।

निकाला जा रहा है category_id है शून्य और सेटिंग id_path regexp '^ उत्पाद / [0-9] + $' समस्या तय।

कॉपी ऐप / कोड / कोर / मैज / कैटलॉग / हेल्पर / प्रोडक्ट / यूआरएल / रिवाइराइट.फैप को ऐप / कोड / लोकल / मैज / कैटलॉग / हेल्पर / प्रोडक्ट / यूआरएल / रिवर्ट.फपी और इस फंक्शन को जोड़ें:

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

फिर ऐप / कोड / कोर / मैज / साइटमैप / मॉडल / संसाधन / कैटलॉग / प्रोडक्टऐप / कोड / स्थानीय / मैज / साइटमैप / मॉडल / संसाधन / कैटलॉग / प्रोडक्ट। एफपीपी और लाइन 72 को बदलें:

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

मूल रूप से https://www.goivvy.com/blog/solved-magento-stuck-generating-google-sitemap-large-website से लिया गया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.