MySQL bị treo (truy vấn bị kẹt khi gửi dữ liệu)


10

Tôi có tình huống sau:

Khoảng 5 lần một tuần (không liên quan đến bất kỳ tình huống cụ thể nào như xóa bộ nhớ cache, tăng lưu lượng truy cập) một số truy vấn bị kẹt khi gửi dữ liệu ( 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

cái thứ hai:

> 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

Các truy vấn này có liên quan đến việc tạo menu điều hướng. Họ chạy mà không có vấn đề gì và rất nhanh mọi lúc.

Vài lần một tháng, một số truy vấn khác bị kẹt trong dữ liệu an toàn hoặc chờ khóa bảng:

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

(liên quan đến tìm kiếm)

Thông tin bổ sung:

  • core_url_rewrite - Bản ghi 3M (30 trang web, sản phẩm 100k)
  • catalog_carget_flat_store_ * - 2000 bản ghi (sử dụng danh mục phẳng được bật)

Điều này đang chạy trên một thiết lập sử dụng vmware trên một số phần cứng lớn (mysql master có 8 lõi được phân bổ và 64Gb RAM, ổ SSD trên bộ lưu trữ SAN), mysql được tối ưu hóa và được theo dõi liên tục. Có một số vấn đề trong quá khứ liên quan đến I / O (một số hiện tại có liên kết giữa các máy chủ và bộ lưu trữ SAN).

Chúng tôi không thể xác định chính xác vấn đề vì chạy trên kim loại trần (không ảo hóa, cùng cấu hình) điều này không xảy ra bao giờ, trong điều kiện căng thẳng cao (chạy bao vây + kịch bản kiểm tra tải, không có bộ đệm).

Bất cứ ai khác có vấn đề tương tự?

CẬP NHẬT:

reindexTất cả tìm kiếm đã được chuyển sang một bảng tạm thời (vì vậy nó không khóa bảng chính được sản xuất sử dụng, sau đó đổi tên bảng tmp). Vì vậy, quá trình reindex không can thiệp vào khách truy cập tìm kiếm trang web. https://github.com/magendooro/magento-fulltext-reindex kudos để carco


Bạn có chắc chắn, họ chạy nhanh? Thay thế có thể là menu điều hướng được lưu trữ. Afaik là việc sử dụng một chỉ mục không dễ dàng bởi vì, không có chỉ mục nào trên category_ud, is_system và đường dẫn. Và đường dẫn là một THÍCH, vì vậy MySQL có một vấn đề thực sự ở đây. Tôi không có db xuất btw ;-) Chỉ 2cents
Fabian Blechschmidt

1
mà chọn chạy trong dưới 1 giây. các truy vấn tiếp tục chồng chất khi người đầu tiên ở lại gửi dữ liệu ...
FlorinelChis

1
FWIW Tôi đã thấy vấn đề tương tự.
philwinkle

@philwinkle thiết lập tìm kiếm của bạn như thế nào? toàn văn?
FlorinelChis

1
github.com/magendooro/magento-fulltext-reindex điều này đã giúp chúng tôi và quyết định xuất bản mã nguồn.
FlorinelChis

Câu trả lời:


4

Nó trông giống như một lỗi / hồi quy cốt lõi mà chúng ta đã thấy trong 1.7 khi bộ đệm và bộ sưu tập bộ đệm không hoạt động hiệu quả cho menu điều hướng ( catalog/navigation/top.phtml).

Bạn có thể kiểm tra bằng cách loại bỏ nó, hoặc chỉ tạm thời bắt đầu ra thành một tệp với một ob_startvà phục vụ nó từ một tệp / memcache tĩnh.

Ngoài ra, phần cứng bạn đang sử dụng không có âm thanh lớn và có vẻ như được chỉ định cho kích thước của cửa hàng bạn có. Có lẽ cũng có một nút cổ chai I / O - Bộ lưu trữ SAN + mạng bị nghẽn = hiệu suất kém.

-

Là một giải pháp thô, bạn có thể điều chỉnh lớp khối cho điều hướng (kết xuất get_class($this)) top.phtmlđể xác định nó.

Điều này sẽ cho phép bộ nhớ đệm trên toàn trang web, mà không có bộ đệm ẩn cấp độ danh mục mà phiên bản mới được gọi. Cũng đáng loại bỏ is_activelớp khỏi trình kết xuất cây nếu bạn làm điều này để tránh các mục menu ngẫu nhiên xuất hiện được chọn (và thực hiện thay thế JS thay thế).

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

trước đây chúng tôi đã phân bổ 32 lõi và 92Gb ram (và thay đổi cấu hình mysql tương ứng, kết quả tương tự) - máy chủ có 64 lõi và 184 gb ram (đó là lý do tại sao tôi nói nó rất lớn) ... xin lỗi, tôi đã không đề cập đó là Magento Enterprise 1.12. chúng tôi đã theo dõi lưu lượng truy cập mạng không thấy bất cứ điều gì chỉ ra nút cổ chai (chúng tôi đã gặp sự cố trước đó, đầu nối cáp không hoạt động bình thường, nó đã được thay thế).
FlorinelChis

Enterprise 1.12 là CE 1.7 - chúng là cùng một cơ sở mã. Vì vậy, lỗi sẽ ảnh hưởng đến cả hai. Hãy thử những gì tôi đã nói (mã cứng điều hướng hàng đầu và vô hiệu hóa các danh mục trên điều hướng lớp) và bạn có thể xác nhận. Nhiều phần cứng sẽ không tạo ra sự khác biệt nếu phần mềm không được thiết lập đúng để sử dụng nó.
Ben Lessani - Sonassi

Tôi sẽ chỉnh sửa câu trả lời của mình và thêm một số mã hack để bạn sử dụng để xác nhận
Ben Lessani - Sonassi

Đó là một nơi tốt để bắt đầu, tôi sẽ đặt một cái gì đó vào vị trí và xem nếu nó vẫn bị hỏng trong vòng 1 tuần :)
FlorinelChis

3

Thay thế chức năng tại

ứng dụng / mã / lõi / Pháp sư / Danh mục / Người trợ giúp / Danh mục / 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

Trong trường hợp của chúng tôi, nó đã đi đến truy vấn chậm này:

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

từ ứng dụng / mã / lõi / Pháp sư / Sơ đồ trang web / Mô hình / Tài nguyên / Danh mục / Sản phẩm.php .

Nó bị treo vì câu lệnh category_id IS NULL . MySQL vì một số lý do đã không sử dụng một chỉ mục.

Xóa category_id IS NULL và đặt id_path REGEXP '^ sản phẩm / [0-9] + $' đã khắc phục sự cố.

Sao chép ứng dụng / mã / lõi / Mage / Danh mục / Người trợ giúp / Sản phẩm / Url / Rewrite.php sang ứng dụng / mã / cục bộ / Mage / Danh mục / Người trợ giúp / Sản phẩm / Url / Rewrite.php và thêm chức năng này:

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

Sau đó sao chép ứng dụng / mã / lõi / Mage / Sơ đồ trang web / Mô hình / Tài nguyên / Danh mục / Product.php sang ứng dụng / mã / cục bộ / Mage / Sơ đồ trang web / Mô hình / Tài nguyên / Danh mục / Product.php và thay đổi dòng 72 thành:

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

Ban đầu được lấy từ https://www.goivvy.com/blog/solve-magento-stuck-generating-google-sitemap-large-website

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.