Oldal: 1 / 2 12 UtolsóUtolsó
Eredmény: 1 - 10 (16) összesen

Téma: Mysql Ram és CPU túlterhelés - my.cnf kérdés

  1. #1
    búgócsiga Akka logója
    Csatlakozott
    10-05-06
    Hozzászólás
    3.845
    Begyűjtött 1.442 köszönetet
    741 hozzászólásával

    Alapbeállítás Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Van egy crawlerem, amit Ubuntu alól futtatok localhostról (mysql, apache, php5).
    A gépem: 16GB Ram, i7 (8 core), SSD.

    A crawler sok-sok szálon fut, ezért van egy olyan kötöttség, hogy a my.cnf-ben a "max_connections = 8000" van beállítva.

    A mysqltunernél már minden zöld, de a ramom futás közben mégis "elfogy", a proci is komolyan igénybe van véve.
    Annyi mindent összeolvastam a neten, hogy tudtam némileg optimalizálni, most ezt használom:

    PHP kód:
    key_buffer        256M
    max_allowed_packet    
    128M
    thread_stack        
    196K
    thread_cache_size       
    8
    # This replaces the startup script and checks MyISAM tables if needed
    # the first time they are touched
    myisam-recover         BACKUP
    max_connections        
    8000
    #table_cache            = 64
    #thread_concurrency     = 10 
    Illetve:

    PHP kód:
    #
    # * Query Cache Configuration
    #
    query_cache_type 0
    query_cache_size 
    132M
    query_cache_limit 
    8M
    sort_buffer_size 
    512K
    join_buffer_size 
    128K
    innodb_buffer_pool_size 
    2196M 
    Néztem a mysqlcalculator.com-ot is, és ez alapján állítani az értékeket, de mégsem akar igazán jó lenni a cucc. Azzal tudok játszani, ha sokkal kevesebb szálon megy a crawler, de szeretném kimaxolni amennyire csak lehet.

    Tudtok adni tippeket, hogy mit hogy érdemes változtatni a jobb működés érdekében?

    Akár a max connenction-re valamilyen beállítási alternatívát, vagy bármelyik másik értékre.

    Köszi előre is.



  2. #2
    Bölcs earnnet logója
    Csatlakozott
    12-08-15
    Hely
    Budapest
    Hozzászólás
    1.820
    Begyűjtött 812 köszönetet
    576 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Van egy gyanúm, hogy az a crawler egy php szkript. Ugye? A php lassú. Át is lehetne fordítani mondjuk C kóddá (php2c), így előre meglesz a bináris és nem futásidőben fog interpretálódni. Vagy külön futtatható fájlra is fordíthatod ezzel: http://www.phpcompiler.org/ Ezen kívül persze érdemes lenne megnézni, hogy azon a kódon lehet-e javítani. Az is okozhat bajt, ha az egyik futása nem fejeződik be, amire az új szálat létrehozza a következő cron parancs.


    Utoljára módosítva: earnnet által : 2015-12-30 23:36

  3. Az alábbi felhasználók hálásak a válaszért:

    Akka (2015-12-31)

  4. #3
    Bölcs
    Csatlakozott
    10-01-15
    Hely
    Győr
    Hozzászólás
    589
    Begyűjtött 32 köszönetet
    30 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Idézet earnnet eredeti hozzászólása Hozzászólás megtekintése
    Van egy gyanúm, hogy az a crawler egy php szkript. Ugye? A php lassú. Át is lehetne fordítani mondjuk C kóddá (php2c), így előre meglesz a bináris és nem futásidőben fog interpretálódni. Vagy külön futtatható fájlra is fordíthatod ezzel: phc -- the open source PHP compiler Ezen kívül persze érdemes lenne megnézni, hogy azon a kódon lehet-e javítani. Az is okozhat bajt, ha az egyik futása nem fejeződik be, amire az új szálat létrehozza a következő cron parancs.
    Az opcache szerintem jobb megoldás, mert az az előre fordított bytekódot teszi a memóriába.

    A kérdező feltehetne egy mysqltuner.pl kimenetet is.


    Utoljára módosítva: dragon1993 által : 2015-12-31 00:07

  5. The Following 2 Users Say Thank You to dragon1993 For This Useful Post:

    Akka (2015-12-31), earnnet (2015-12-31)

  6. #4
    Hekker 0xFF logója
    Csatlakozott
    09-08-21
    Hozzászólás
    1.079
    Begyűjtött 168 köszönetet
    118 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Nem a MySQL lesz a szúk keresztmetszet egy crawler esetében. Sokkal valószínűbb, hogy van a crawlerben egy memory leaked, php esetében túl sok rekurzió, JS ben meg kismillió helyen lehet, ha rosszul van megírva a kód.



  7. The Following 2 Users Say Thank You to 0xFF For This Useful Post:

    Akka (2015-12-31), Geri (2015-12-31)

  8. #5
    búgócsiga Akka logója
    Csatlakozott
    10-05-06
    Hozzászólás
    3.845
    Begyűjtött 1.442 köszönetet
    741 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Idézet dragon1993 eredeti hozzászólása Hozzászólás megtekintése
    A kérdező feltehetne egy mysqltuner.pl kimenetet is.
    PHP kód:
    [--] Up for: 48m 15s (4K q [1.460 qps], 1K connTX893KRX651K)
    [--] 
    Reads Writes80% / 20%
    [--] 
    Total buffers541.0M global + 1.4M per thread (9000 max threads)
    [
    OKMaximum possible memory usage13.2G (84of installed RAM)
    [
    OKSlow queries0% (0/4K)
    [
    OKHighest usage of available connections0% (35/9000)
    [
    OKKey buffer size total MyISAM indexes256.0M/244.2M
    [OKKey buffer hit rate97.7% (797 cached 18 reads)
    [!!] 
    Query cache efficiency0.0% (0 cached 1K selects)
    [
    OKQuery cache prunes per day0
    [OKSorts requiring temporary tables0% (0 temp sorts 167 sorts)
    [
    OKTemporary tables created on disk20% (54 on disk 269 total)
    [
    OKThread cache hit rate97% (35 created 1K connections)
    [
    OKTable cache hit rate95% (149 open 156 opened)
    [
    OKOpen file limit used0% (94/45K)
    [
    OKTable locks acquired immediately100% (1K immediate 1K locks)
    [!!] 
    InnoDB data size buffer pool2.8G/128.0M 
    Az InnoDB-t is be tudom tenni, hogy zöld legyen, de nem volt sok jelentősége, ahogy észrevettem.

    A szkript valóban php. Feltettem az Apache helyett a HHVM-et is tesztként, de ez 3 perc után elhasalt, és amíg ment is nagyon lassú volt.

    Most a phpcompiler.org-ot fogom kipróbálni.



  9. #6
    a zsolti
    Vendég

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Nginx-szel milyen? Az állandó MySQL-nyúzást nem tudod csökkenteni? Pl. valamilyen memcache megoldással cache-elsz/előolvasol és csak amikor muszáj, akkor nyúlsz a db-hez. De előbb tényleg a kódot, php-t, konfigot kellene átnézni. Az inkább tervezési hiba, ahol 8000 connection nem elég ilyenre.



  10. #7
    Bölcs earnnet logója
    Csatlakozott
    12-08-15
    Hely
    Budapest
    Hozzászólás
    1.820
    Begyűjtött 812 köszönetet
    576 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Az inkább tervezési hiba, ahol 8000 connection nem elég ilyenre.
    Igen, normális körülmények közt (ha elméletben jó a kód) ezt a 8 ezret csak úgy tudom elképzelni, ha túl sűrűn van meghívva a sebességéhez képest. Ha átfedés csak ritkán fordul elő, a lekérdezések batchelésével lehet rajt javítani.

    Mivel már sokat beszéltünk róla és egy vszleg nem egy hosszú kódról van szó, ha gondolod, küldd el privátban a kódot és javítok rajta.



  11. #8
    Bölcs
    Csatlakozott
    07-08-28
    Hozzászólás
    1.030
    Begyűjtött 150 köszönetet
    109 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    A mysqltuner.pl kimenetében látszik, hogy a mysql nincs szét hajtava

    35 konkurens kapcsolat 1.5 query / sec. Ez vicc, át kell nézni, hogy milyen táblákat, milyen indexeket használsz, és a query-k hogy illeszkednek az indexekhez.

    Ha lehet, akkor megoldani, hogy az apache kikerüljön a játékból, és parancs sorból futatni a crawlert, jobb memória kihasználtságot lehet elérni. El lehet játszani azzal, hogy megnézed, hogy egy futás alatt melyik parancsra mennyit kellet várni, és megnézni, hogy azzal tudsz-e valamit kezdeni.

    Ehhez ajánlott eszközök a zend server, nagyon jó futás idejú elemzéseket tud, az ingyenes változat bőven elég erre.
    Ha ezt nincs kedved telepíteni akkor egy xdebug -s egy webgrind ( https://github.com/jokkedk/webgrind ) már jó támpotot ad, hogy mit kell elkezdeni nézni.

    Ha parancs sorból futtatod, akkor vigyázz arra, hogy a php-ban vannak memory leakek. Jó megoldás, hogyha van egy buta master processed ami csak elinditja a szükséges számú childot amik a tényleges munkát végzik. A child-ok pedig 100-1000 elem feldolgozás után kilépnek, és a master indít egy új processzt. Igy kezelni tudod a memória problémákat, ha vannak.



  12. Az alábbi felhasználók hálásak a válaszért:

    Akka (2015-12-31)

  13. #9
    búgócsiga Akka logója
    Csatlakozott
    10-05-06
    Hozzászólás
    3.845
    Begyűjtött 1.442 köszönetet
    741 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    Azt tudni kell, hogy nem egy pár soros scriptről van szó, hanem egy elég spéci összetett cuccról (lehet, hogy hibásan hívom scriptnek, csak könnyű kiejteni és leírni), ami domainekről gyűjt be egy rakat infót (seo, meg egy csomó más infót, jellemzőt is, apikat is használ, stb.).
    Napi szinten 1M+ domaint képes átnézni, ezeknek nagyjából a harmada élő oldal, ezek jellemzőit le is tárolja adatbázisba. Sima otthoni átlagos nettel megy asztali gépről, szerverre nem akarom kitenni még különböző okok miatt. 1000-1500 curl folyamat tud futni most párhuzamosan, terminálból indul, egy shell scripttel. Maga a rendszer elég jó, napi 10E domainről indult, innen lett felturbózva napi 300E-re, ez szerintem nem rossz eredmény.
    A fenti tippek alapján kijött pár hiba, pl. nem volt a szálakon timeout, és előfordult beragadás is, ez falta a memória egy részét.
    Most olyan 40%-on megy a ram, 25%-on a proci, de az is felmerült, hogy a netszolgáltató "ennyit" tud talán, mp-enként átlagosan 10-15 oldalt próbál elérni a progi, vagyis itt is lehet talán valamiféle felső határ, amit nem látok.
    De azt is látom, hogy ha a my.cnf-en állítok apróságot, az is komoly kihatással van a teljesítményre, ezért is próbálom erről az oldalról is optimalizálni.



  14. #10
    Hekker 0xFF logója
    Csatlakozott
    09-08-21
    Hozzászólás
    1.079
    Begyűjtött 168 köszönetet
    118 hozzászólásával

    Alapbeállítás re: Mysql Ram és CPU túlterhelés - my.cnf kérdés

    PHP-val nem fogsz tudni milliós nagyságrendű domaineket crawlingolni, vegyél vissza belőle. Ami segíthet az a PHP7, kb 50% os gyorsulást tud adni, ami a PHP kódot illetni, de ha a PHP curl processeket indit akkor ott valami nagyon nincsen rendben.

    Ha nem segít a PHP7 sem, akkor érdemes áttervezni egy kicsit a dolgokat. Asztali gép esetén UPS + RAM amennyi belefér majd átpakolni az egész MySQL-t RAM ba, vagy kicserélni valami másra, Cassandra, ElasticSearch stb.



  15. Az alábbi felhasználók hálásak a válaszért:

    Akka (2015-12-31)

Oldal: 1 / 2 12 UtolsóUtolsó

Könyvjelzők

Hozzászólás szabályai

  • Új témákat nem hozhatsz létre
  • Válaszokat nem küldhetsz
  • Fájlokat nem csatolhatsz
  • A hozzászólásaidat nem módosíthatod
  •