2012-06-22 2 views
2

У меня есть базовый модуль чата на моем веб-сайте, который каждые 3 секунды обновляет чат-чат с помощью Jquery Ajax, а также еще один вызов jquery для отправки нового сообщения. Ничего особенного. Обычно каждый запрос jQuery ajax занимает всего 0,2 секунды. Но на сервере, когда подключено еще 20 человек, серверный процессор идет очень высоко, и каждый запрос ajax начинает принимать 12-14 секунд, что неприемлемо. А также каждый процесс httpd потребляет 3% - 4% CPU.php + jquery ajax-запросы используют слишком много CPU

Обновить код чата:

updatechatbox = $.getJSON("/chat/update",{ lastid: $("#messageBox li:last-child").attr("id") }, function(json) { 
    $.each(json, function(key, val) { 
     var m = val['message']; 
     var id = val['id']; 
     var messagebox = $("#messageBox ul"); 
     messagebox.append("<li id="+id+"><span class='msg'>"+m+"</span></li>"); 

     var myDiv = $("#messageBox"); 
     myDiv.animate({ scrollTop: myDiv.prop("scrollHeight") - myDiv.height() }, 0); 
    }); 
}); 

Сервер Fedora 15 работает Nginx в качестве прокси-сервера и апача для веб-службы с следующей конфигурацией:


Timeout 120 
KeepAlive On 
MaxKeepAliveRequests 100 
KeepAliveTimeout 15 

IfModule prefork.c 
    StartServers  8 
    MinSpareServers 5 
    MaxSpareServers 20 
    ServerLimit  256 
    MaxClients  256 
    MaxRequestsPerChild 400 
IfModule 

IfModule worker.c 
    StartServers   2 
    MaxClients   150 
    MinSpareThreads  25 
    MaxSpareThreads  75 
    ThreadsPerChild  25 
    MaxRequestsPerChild 0 
IfModule 

Вопросы:
- это нормально, что апач используя столько CPU для каждого процесса httpd?
- Как я могу это исправить?

PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
20089 apache 20 0 57524 16m 5840 S 7.3 0.8 0:18.16 httpd 
19715 apache 20 0 56828 16m 5852 S 6.6 0.8 0:21.58 httpd 
19749 apache 20 0 58536 16m 5864 S 6.6 0.8 0:22.29 httpd 
19732 apache 20 0 62880 21m 5856 S 5.6 1.0 0:19.14 httpd 
19803 apache 20 0 62076 21m 5840 S 5.3 1.1 0:17.94 httpd 
19821 apache 20 0 61856 21m 5828 S 5.0 1.0 0:17.81 httpd 
21574 apache 20 0 61584 18m 4664 S 3.3 0.9 0:00.69 httpd 
19772 apache 20 0 61856 21m 5864 S 2.6 1.1 0:18.53 httpd 
19932 apache 20 0 61856 20m 5844 S 2.6 1.0 0:17.07 httpd 
14307 mysql  20 0 306m 52m 4576 S 2.3 2.6 81:32.57 mysqld 
13175 nginx  20 0 15532 2284 1032 S 0.3 0.1 0:04.61 nginx 

Edit: Моя функция обновления PHP. Использование Zend Framework v1.11.11

public function updateAction() 
{ 
    $auth = Zend_Auth::getInstance(); 
    $user_info = $auth->getStorage()->read(); 
    $adminsess = new Zend_Session_Namespace("admin"); 
    $referrer = $_SERVER['HTTP_REFERER']; 

    $user_id = $user_info->id; 

    $query = "SELECT m.id, m.message, m.user_id 
       FROM messagebox m 
       LEFT JOIN users u ON m.user_id = u.id"; 

    if(isset($_GET['lastid']) && $_GET['lastid'] != ""){ 
     $lastId = $_GET['lastid']; 
     $query .= "WHERE m.id > $lastId"; 
    } 

    $r = $db->query($query); 
    $result = $r->fetchAll(); 

    $data = array(); 

    if(count($result) > 0) { 
     foreach($result as $row) { 
      $data[$row['id']]['id'] = $row['id']; 
      $data[$row['id']]['message'] = $row['message']; 
      $data[$row['id']]['user_id'] = $user_id; 
     } 
    } 

    echo json_encode($data); 
    $this->_helper->layout->disableLayout(); 
} 
+0

Вам нужны чтобы показать нам PHP для того, чтобы помочь определить, почему серверный процессор настолько высок. –

+0

обновлен с помощью функции my/chat/update – Ayan

ответ

2

У меня была аналогичная проблема раньше, и оказалось, что это связано с фиксацией сеанса. Когда сеанс открывается скриптом PHP, который запускает сеанс, этот файл сеанса блокируется. Это означает, что если ваша веб-страница делает многочисленные запросы на PHP-скрипты, например, для загрузки содержимого через Ajax, каждый запрос может блокировать сеанс и предотвращать выполнение других запросов. Это подробно описано here.

Поэтому вам нужно будет сделать:

session_write_close(); 

Если это не причина, проверьте, что вы ничего вычислительно интенсивным, как, большой SQL вызывает много рекурсии и т.п. не делаете

+0

Это не полностью разрешило мою проблему, но это помогло снизить нагрузку на сервер. я попробую socket.io & node.js для моего модуля чата. Благодарю. – Ayan

Смежные вопросы