webserver orribile lento, a volte incredibile veloce

sto eseguendo una piccola comunità (6000+ Membri) in un sistema virtuale a 64 bit di ubuntu 11.04 non virtuale.

Non sono un Linux-pro, nemless avanzato, ho solo cercato di impostare un server web, che in realtà non fa niente di speciale. La consegna di alcuni siti dinamici PHP e RoR è il suo task. Quindi potrebbe essere che i miei file di configuration sembrano orribili cattivi. Inoltre, potrei usare il vocabolario sbagliato, quindi in dubbio, per favore.

  • Login blackout per MySQL
  • Vuoi usare Splunk?
  • Come limitare il server a specifici indirizzi IP con mod_authz_host?
  • memcached non riavviare correttamente start-stop-daemon: avviso: non è riuscito a uccidere 8175: Nessun process
  • Come get HTTP preseed per funzionare correttamente su Ubuntu 10.04 LTS (Lucid)?
  • Devo salvare e ripristinare il database `mysql`?
  • Con un record corrente di 520 utenti registrati (conti di bordo, nessun utente di sistema) in linea allo stesso tempo, il carico server medio è di circa 2,0 – 5,0. Nel frattempo (~ 250 utenti) il valore medio di carico del server è a circa 0.4 – 0.8, a volte, in alcune ricerche costose un po 'più alto. tutto bene.

    Tuttavia, di tanto in tanto il carico aumenta fino a 120 (120,0, non 12,0;)). In questo momento, è difficile collegarsi anche via SSH, ma quando arrivo al server e utilizzo top / htop / iotop per vedere cosa succede, non riesco a identificare alcun process che causa un carico elevato della CPU.

    iotop mi dice di una velocità di lettura / scrittura corrente di circa ca. 70kb / s, che è abbastanza uguale al power-off penso.

    L'utilizzo della memory è max. a ~ 12GB di 16GB, quindi lo scambio rimane vuoto.

    ora la strana (alless per me 🙂

    in attesa di alcuni minuti (dal momento che ho sempre un po 'di panico quando succede, si sente come 5 minuti, ma suppongo che sia più simile a 20-30 minuti) e il server torna alla normalità. tutto continua come normale.

    un altro fatto strano:

    quando eseguo hdparm -tT / dev / sda, ottengo risposta come:

    /dev/sda: Timing cached reads: 7180 MB in 2.00 seconds = 3591.13 MB/sec Timing buffered disk reads: 348 MB in 3.02 seconds = 115.41 MB/sec 

    quando eseguo lo stesso command mentre il server è "congelato", la risposta è simile

     /dev/sda: <- takes about 5 minutes until this line appears Timing cached reads: 7180 MB in 2.00 seconds = 3591.13 MB/sec <- 5 more minutes Timing buffered disk reads: 348 MB in 3.02 seconds = 115.41 MB/sec <- another 5 minutes 

    quindi i valori sono gli stessi, ma l'ora citata è completamente sbagliata. usando il command di tempo come prefisso mi dice anche che sono stati utilizzati ~ 15 minuti.

    Ho cercato in dmesg, / var / log / [messaggi | syslog] – niente trovato.

    / var / log / errori tuttavia mi dice che:

      Jul 4 20:28:30 localhost kernel: [19080.671415] INFO: task php5-fpm: 27728 bloccato per più di 120 secondi.
     Jul 4 20:28:30 localhost kernel: [19080.671419] "echo 0> / proc / sys / kernel / hung_task_timeout_secs" distriggers questo messaggio. 

    più volte. ora questo messaggio mi dice che l'attività di php5-fpm è stata bloccata o bloccata? – ma non se questa è la causa o solo uno dei risultati di quel "congelamento". Chiunque?

    per tagliare la lunga storia breve, non so where cominciare ad analizzare. Quindi, se mi puoi dare qualche consiglio consultando le specifiche e le configurazioni seguenti, o chiedethemes di fornire ulteriori informazioni, sarò felice.

     Specifiche:
    
         Processore 6 core AMD Phenom (tm) II X6 1055T *
         16 Gigabyte Ram
         2x 1,5 TB Seagate ST1500DL003-9VT16L tramite SATA 3 tramite SoftwareRaid (suppongo)
    
     Servizi: (a causa del servizio --status-all, quelli con [+]) 
    
         nginx Webserver 1.0.14
         server mySQL 5.1.63 
         Ruby on Rails 2.3.11 (passeggero-nginx-module)
         php5-fpm 5.3.6-13ubuntu3.7 
         SSH
         ido2db
    
    
     Ulteriori servizi:
    
          predefinito crontab + backup notturno.
          syslog-ng
    
    

    Il sito è composto da 2 sottodomini, forum. e www. where il forum è un phpBB3.x PHP-Board, e www un Ruby on Rails 2.3.11 applicazione (portle).

    Mini-Nota: a volte noto che il forum è piuttosto lenta, al contrario del portle sempre veloce (ad exception di questo "congelamento"). Entrambi condividono lo stesso database, ma il portle lo utilizza in sola lettura.

    Il webserver è nginx, usando il module passeggeri di phusion per comunicare con l'applicazione ruby. Inoltre, per il forum comunica con php5-fpm tramite socket:

    pertinenti parti di configuration di nginx (con commenti / domande che iniziano da;)

     ;  in caso di congelamento a causa dell'attività file system troppo elevata, magari aggiungendo un limite?
     # worker_rlimit_nofile 50000;
     dati utente www;
     ;  6 core, quindi ho letto 6 adatta.  forse già sbagliato?
     worker_processes 6;  
     pid /var/run/nginx.pid;
     events {
             worker_connections 1024;
     }
    
    
     http {
             passenger_root /var/lib/gems/1.8/gems/passenger-3.0.11;
             passenger_ruby /usr/bin/ruby1.8;
    
     ;  il forum una volta caratterizzato una chat, che stava lavorando con i websockets. 
     ;  quindi è stato un inferno di richieste di richiamo (distriggersto ora, congelamento ancora in corso)
             keepalive_timeout 65;
             keepalive_requests 50;
             gzip su;
    
             server {
                     ascoltare 80;
                     nome_server www.domain.tld;
                     root / var / www / dominio / rotaie / pubblico;
                     passenger_enabled on;
             }
    
             server {
                     ascoltare 80;
                     server_name forum.domain.tld;
    
                     luogo / {
                             root / var / www / dominio / forum;
                             index index.php;
                     }
     ;  roba satica da gestire da nginx
                     la posizione ~ * ^ / style /.+. (jpg | jpeg | gif | css | png | js | ico | xml) $ {
                             access_log distriggersto;
                             scade 30d;
                             root / var / www / dominio / forum /;
                     }
    
     ;  ora la magia php, nota il "backend" -fcgi_pass
                     posizione ~ .php $ {
                             fastcgi_split_path_info ^ (. + \. php) (. *) $;
                             fastcgi_pass backend;
                             fastcgi_index index.php;
                             fastcgi_param SCRIPT_FILENAME / var / www / dominio / forum $ fastcgi_script_name;
                             include fastcgi_params;
                             fastcgi_param QUERY_STRING $ query_string;
                             fastcgi_param REQUEST_METHOD $ request_method;
                             fastcgi_param CONTENT_TYPE $ content_type;
                             fastcgi_param CONTENT_LENGTH $ content_length;
                             fastcgi_intercept_errors su;
                             fastcgi_ignore_client_abort off;
                             fastcgi_connect_timeout 60;
                             fastcgi_send_timeout 180;
                             fastcgi_read_timeout 180;
                             fastcgi_buffer_size 128k;
                             fastcgi_buffers 256 16k;
                             fastcgi_busy_buffers_size 256k;
                             fastcgi_temp_file_write_size 256k;
                             fastcgi_max_temp_file_size 0;
                     }
    
                     posizione ~ / \.ht {
                             negare tutto;
                     }
    
             }
    
     , la presa php5-fpm.  ho letto che / dev / shm / whould essere il posto fastes per questo.  ctriggers idea in generale?
             backstream a monte {
                     server unix: / dev / shm / phpfpm;
             }
            ...
     }
    

    le impostazioni di php5-fpm (ho cambiato i valori dovuti ai messaggi del log degli errori php5-fpm più in alto .. (anche il problema di congelamento era già presente) *

    
     ascolta = / dev / shm / phpfpm 
     user = www-dati
     gruppo = www-dati
     pm = dinamico
    
    
     ;  santo, 4000!  Beh, scintillare questo valore a livello di terra mi ha dato 
     ;  100s di 502 errori di gateway comandi.  questi valori erano abbastanza stabili.
     ;  dal momento che ci sono solo max 520 utenti online non lo ottengo, perché avrei bisogno
     ;  come molti bambini configurati qui.  dovuto al mantenimento vivo forse?
     ;  chiedere domande è più facile per me poiché riavviare il server farà
     ;  i miei membri della comunità sono arrabbiati;)
     pm.max_children = 4000 
     pm.start_servers = 100
     pm.min_spare_servers = 50 
     pm.max_spare_servers = 150 
     pm.max_requests = 10
    
     pm.status_path = / status
     ping.path = / ping
     ping.response = pong
     slowlog = log / $ pool.log.slow
    
     ; devo usare rlimit?
     ; rlimit_files = 1024
    
     chdir = /
    

    mysql / my.cnf

     [cliente]
     port = 3306
     socket = /var/run/mysqld/mysqld.sock
    
     [Mysqld_safe]
     socket = /var/run/mysqld/mysqld.sock
     bello = 0
    
     [Mysqld]
     user = mysql
     socket = /var/run/mysqld/mysqld.sock
     port = 3306
     basedir = / usr
     datadir = / var / lib / mysql
     tmpdir = / tmp
     saltare-external-bloccaggio
     bind-address = 127.0.0.1
     key_buffer = 16M
     max_allowed_packet = 16M
     thread_stack = 192K
     thread_cache_size = 8
     myisam-recover = BACKUP
    
     ;  numero elevato, ma less fornisce alcuni errori di phpBB.
     max_connections = 450
     table_cache = 512
    
     ;  Ho letto due volte i nuclei della CPU, male?
     thread_concurrency = 12 
     join_buffer_size = 2084K
     concurrent_insert = 3
     query_cache_limit = 64M
     query_cache_size = 512M
     query_cache_type = 1
    
     log_error = /var/log/mysql/error.log
     log_slow_queries = /var/log/mysql/mysql-slow.log
     long_query_time = 2
     expire_logs_days = 10
     max_binlog_size = 100M
     low_priority_updates = 1
    
     [Mysqldump]
     veloce
     quote-nomi
     max_allowed_packet = 16M
    
     [Isamchk]
     key_buffer = 16M
     ! includedir /etc/mysql/conf.d/
    

    Ho già usato smartctl, i hdds sembrano benissimo. citazioni / proc / mdstatus:

     Personalità: [raid1] [lineare] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
     md3: attivo raid1 sda3 [1]
           1459264192 blocchi [2/1] [_U]
    
     md1: attivo raid1 sda1 [0]
           3911680 blocchi [2/1] [U_]
    
     dispositivi non utilizzati: 
    

    ulimit -a

     dimensione del file di base (blocchi, -c) 0
     dimensione dati seg (kbytes, -d) illimitato
     priorità di pianificazione (-e) 0
     dimensione del file (blocchi, -f) illimitato
     i segnali pendenti (-i) 127727
     max memory bloccata (kbytes, -l) 64
     la dimensione massima della memory (kbytes, -m) illimitata
     aprire i file (-n) 1024
     dimensione del pipe (512 byte, -p) 8
     Code di messaggistica POSIX (byte, -q) 819200
     priorità in tempo reale (-r) 0
     dimensione dello stack (kbytes, -s) 8192
     tempo di cpu (secondi, -t) illimitato
     i processi utente max (-u) 127727
     memory virtuale (kbytes, -v) illimitata
     block file (-x) illimitato
    

    Citando alcune domande nei miei file di configuration, questi non sono (intenzionali) direttamente correlati ai problemi, ma sarebbe bello per me sapere se sono veramente discutibili o fatti bene.

    Un ulteriore fattore: il mio database MYSQL è di 12 GB.

    Non so se ciò import, ma il mytop mi mostra talvolta 4-5 secondi di query lunghe, alcune sono 20-30 secondi. È solo una sensazione che non riesco a dimostrare (perché non so come), ma quando disattivo il database, il congelamento sembra non accadere.
    Esempio:

    ho creato un'applicazione binari binari per vedere il registro di sviluppo. l'applicazione ha fatto alcune query SQL, letture e inserzioni.

    il log spesso era come:

      Carica DbTest (0.3ms) SELEZIONE * DA `db_test` WHERE (` db_test`.`id` = 31722) LIMITO 1
      SQL (0.1ms) BEGIN
      Aggiornamento di DbTest (0.3ms) UPDATE `db_test` SET` updated_at` = '2012-07-04 23:32:34' WHERE `id` = 31722
    
      - ora il registro si ferma per 5-60 secondi.
    
      SQL (49.1ms) COMMIT
    
      - Il tempo di aggiornamento SQL nel registro non include il tempo di congelamento
    
     Test di rendering / indice
     Completato in 96ms (Visualizza: 16, DB: 59) |  200 OK [http: // localhost: 9000 / test]
    
    

    La parte difettosa è: questo mini-congelamento qui accade solo di tanto in tanto. nota: nel frattempo non riesco neanche a caricare i file tramite scp.

    Attualmente mi sento come correre forma male a peggiorare e indietro da googling per il mio problema di server a causa di immensa mancanza di conoscenza per quanto riguarda le configurazioni server. Ancora mi fa domandare, perché questi problemi appaiono anche, dato che 250 utenti non è un tempo tanto elevato, giusto?

    Quindi le mie domande:

    • cosa è sbagliato e come risolvere? 😉 o:

    • quali informazioni posso fornire per rendere più chiara la situazione?

    • posso indicare una linea di configuration critica che devo prendere in considerazione per recuperare la documentazione?
    • ci sono strumenti che posso fare per vedere alcuni possibili colli di bottiglia?
    • qualsiasi ulteriore consiglio? (accanto a: "paga qualcuno che sa cosa fa" – è un progetto privato, il server è già abbastanza a posto 🙂 :))

    Grazie per il tuo tempo e per l'aiuto.

    Cordiali saluti, Daniel

    PS: ho rinominato i configfiles a domain.tld poiché non voglio avere più% di carico al server finché non sia fisso. potrebbe essere un pensiero esagerato.

    PPS: se ho chiesto una domanda duplica completa, mi dispiace. i miei risultati di ricerca sembravano essere piuttosto specifici a modo loro.

    Edit:

    ha appena ottenuto alcuni valori iotop 99,99% mentre il sistema sembra essere congelato. può essere considerato questo fatto?

    Edit2:

    ora ho appena notato che questo anche occours con un carico di 3-5 .. iotop risultati sono da 0-99% raid / mysql .. mhmm

  • httpd morti ma i sottoscrizioni sono bloccati
  • Problemi con sssd e integrazione di Active Directory
  • Quale struttura di file ZFS da utilizzare per il sistema Linux zfs-root?
  • Come si arresta PostgreSQL dall'avvio di un cluster sotto Linux (Ubuntu)
  • dhclient.conf: invia 2x nomi host al server DHCP?
  • Nuovo programma di linux per linux?
  • 4 Solutions collect form web for “webserver orribile lento, a volte incredibile veloce”

    Hai guardato tutti i tipi di metriche, ma sembra che abbia perso quelli che iniziai: cosa succede ai tempi delle richieste durante il rallentamento, mentre ti aspetti che tutto sia più lento, ci sono URL con livelli più elevati accesso che port agli events? Gli events seguono qualsiasi tipo di model rispetto al tempo?

    Sembra avere elevati livelli di concorrenza – ma parti della tua configuration MySQL sembrano essere configurate per MyISAM – innodb potrebbe essere migliore per questa configuration, tuttavia un mysqld lento influirà solo indirettamente sulle metriche di carico (a less che i processi di attesa 120 siano tutti mysqld? ). Stai eseguendo un mix di motori? Se stai attaccando con MyISAM, riduci il numero di thread e aumenta la chiave_buffer_size. Indipendentemente da quale motore utilizzare le tabelle, modificare il tempo di query lungo a zero (alless temporaneamente) e iniziare a analizzare i file di log con mysqldopslow.

    Non vorrei mettere molta fiducia nei benchmark di hdparm – è un sostituto molto scarso per cose come bonnie ++ e fio – ma anche quest'ultimo è difficile usare yo per modellare il traffico reale dell'applicazione.

    L'ultima volta che ho avuto il congelamento random come quello era un cavo di disco danneggiato che ha causato l'azionamento di tempo e ha bisogno di riavviare a volte; Mi sarei aspettato che gli errori di quel livello sarebbero stati riportti abbastanza forte in dmesg però: S

    Ti consiglio di submit un argomento "MySQL rallenta il sistema durante la scrittura dei dati" a https://dba.stackexchange.com/ , perché sembra un problema con MySQL. Non può essere con PHP, perché questo accade anche con RoR. Inoltre, è ansible utilizzare PHP o Ruby in SSH per connettersi a MySQL e eseguire la scrittura da row di command o accedere direttamente a MySQL e quindi provare. Se in entrambi i casi il sistema rallenta, deve essere MySQL e non nginx.

    se il disco rigido è sul RAID locale – controlla se lo stato della batteria è soddisfacente – e la cache locale è abilitata – altrimenti le tue scritture saranno molto più lente

    utilizzare anche mpstat -P ALL per vedere se tutti i core sono altrettanto occupati all'ora di punta

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.