Redis Phiên chậm


7

Tôi đã kích hoạt redis cho phiên, có phần mở rộng và mã lib mới nhất từ ​​github và tôi nhận thấy một số yêu cầu mất khoảng 30 giây - và điều này xảy ra khá thường xuyên và nó luôn bị lỗi.

Dưới đây là 3 dấu vết giao dịch từ newrelic, chúng trông khá giống tôi: http://imgur.com/JQUzheJ,0sCqUni,3L4PJAX

Tôi đang sử dụng các cài đặt sau trong redis:

    <redis_session>
            <host>127.0.0.1</host>
            <port>6379</port>
            <password></password>
            <timeout>2.5</timeout>
            <persistent></persistent>
            <db>2</db>
            <compression_threshold>2048</compression_threshold>
            <compression_lib>lzf</compression_lib>
            <log_level>4</log_level>
             <!-- maximum number of processes that can wait for a lock on one session; for large production clusters, set this to at least 10% of the number of PHP processes -->
            <max_concurrency>12</max_concurrency>
            <!-- seconds to wait for a session lock in the frontend; not as critical as admin -->
            <break_after_frontend>5</break_after_frontend>
            <break_after_adminhtml>30</break_after_adminhtml>
            <!-- Bots get shorter session lifetimes. 0 to disable -->
            <bot_lifetime>7200</bot_lifetime>
    </redis_session>   

Hiện tại, chỉ có một máy chủ frontend đang được sử dụng cho magento.

Cảm ơn!

Câu trả lời:


5

Nó có thể là một tá điều khác nhau và nếu không có một cái nhìn tổng quan đầy đủ về toàn bộ máy chủ của bạn tại thời điểm đó, sẽ không thể đưa ra một câu trả lời dứt khoát.

Nó có thể là,

  • redis-server xử lý ở CPU 100%
    • Do lưu vào dữ liệu trong bộ nhớ để duy trì
    • Do hết hạn trong thời gian trục xuất
    • Do một quá trình nặng nề được thực thi
  • Nút cổ chai phía máy chủ
    • Nếu đó là VPS / Cloud thì có thể là một khách khác trên hypanneror đang tiêu tốn tài nguyên, buộc bạn phải treo (mẹo. Đừng sử dụng VPS / Cloud nếu bạn muốn độ tin cậy và dự đoán được)
    • Tình trạng OOM do hoán đổi, v.v. hoặc trao đổi bộ nhớ từ bộ đệm / bộ đệm sang không gian người dùng
    • Tải CPU cao làm đói quá trình Redis
    • Không có trạng thái TCP khả dụng (ví dụ: bảng đầy đủ)
    • Không có ổ cắm có sẵn
    • Không có mô tả tập tin có sẵn
  • Redis đa mục đích
    • Sử dụng cùng một ví dụ Redis (không phải cơ sở dữ liệu) cho cả bộ đệm và phiên sẽ gây ra loại hành vi này. Nếu bạn cũng đang sử dụng Redis cho bộ đệm, thì hãy chỉnh sửa tập lệnh init của bạn để khởi tạo hai con quỷ riêng biệt trên hai cổng / ổ cắm khác nhau.

Danh sách có thể đi và về. Những gì bạn cần là theo dõi đầy đủ và đúng cách toàn bộ máy chủ của bạn, để bạn có thể thấy chính xác những gì đang xảy ra để chẩn đoán.

Điều đó bao gồm vẽ đồ thị mọi ứng dụng với Munin, ghi nhật ký lịch sử với daemon Atop, ghi nhật ký và tập trung dữ liệu nhật ký vào một bảng điều khiển duy nhất.

Relic mới là một công cụ tốt, trong khi hữu ích cho một số xác định vấn đề, nó không nhất thiết là công cụ tốt nhất để thử và có đầy đủ tầm nhìn về nguyên nhân của vấn đề.


Nơi dễ nhất để bắt đầu sẽ là kiểm tra xem Redis có cần thêm bộ nhớ không,

redis-cli
> info

So sánh bộ nhớ tối đa với giới hạn bạn đã xác định.


Lưu ý Nhà cung cấp dịch vụ lưu trữ của bạn sẽ có thể trả lời câu hỏi này ngay lập tức, tôi chắc chắn sẽ đề nghị yêu cầu đầu vào của họ.


4

Tùy thuộc vào phiên bản của bạn (Tôi đang sử dụng 1.8ở đây) Cm_RedisSession_Model_Session sẽ sleep()theo các điều kiện nhất định:

Dòng 325

// Detect dead waiters
if ($tries == 1 /* TODO - $tries % 10 == 0 ? */) {
    $detectZombies = TRUE;
    // TODO: allow configuration of sleep period?
    usleep(1500000); // 1.5 seconds
}

Dòng 364:

if ($tries >= $this->_breakAfter+self::FAIL_AFTER) {
    // ...
    if ($this->_logLevel >= 5) {
        // ...
        Mage::log(
            sprintf(
                "%s: Giving up on read lock for ID %s %s",
                $this->_getPid(),
                $sessionId,
                $additionalDetails
            ),
            Zend_Log::NOTICE, self::LOG_FILE
        );
    }
    break;
}
else {
    // TODO: configurable wait period?
    sleep(1);
}

Tạo một hồ sơ Xdebug và xem nếu đây là nơi mọi thứ đang treo lên. Cả hai dòng này đều có liên quan đến việc khóa trong phiên.

Tôi gặp vấn đề này với một khách hàng sleep()được gọi từ 20 đến 30 lần. Chúng tôi đã kết thúc việc chuyển sang các phiên DB. Ngoài ra, bạn có thể thử nâng cấp Cm_RedisSession_Model_Sessionvới bản mới nhất

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.