philos Δημοσ. 6 Μαρτίου 2018 Δημοσ. 6 Μαρτίου 2018 (επεξεργασμένο) Καλησπέρα! Αναζητώ τις προτάσεις σας από ειδικούς σε θέματα παραμετροποίησης server (PHP/MariaDB/Apache) για την καλύτερη εξυπηρέτηση των επισκεπτών μιας ιστοσελίδας. Να ξεκινήσω λέγοντας ότι το site που διαχειρίζομαι είχε θέματα ταχύτητας και πολλές φορές εμφάνιζε και database error (error mysqli_real_connect(): (08004/1040): Too many connections). Αυτό λύθηκε αλλάζοντας το max_connections στο my.cnf από 100 που ήταν, σε 500, μετά από πρόταση του υπεύθυνου της εταιρείας που φιλοξενεί το site. Είναι καλή τιμή το 500 ή να το ανεβάσω κι άλλο; Με αφορμή αυτή τη διόρθωση για την οποία δεν κατείχα τη γνώση να την κάνω μόνος μου εξ αρχής, αναζητώ και τυχών άλλες προτάσεις που έχετε να προτείνετε, καθώς τα my.cnf / php.ini κτλ έχουν πολλές παραμέτρους. Επεξ/σία 6 Μαρτίου 2018 από philos
ajaxmonkey4hire Δημοσ. 6 Μαρτίου 2018 Δημοσ. 6 Μαρτίου 2018 Μπορείς να αυξήσεις την ταχύτητα τουλάχιστον 20 φόρες με τον εξής τρόπο 1. άλλαξε από Apache σε Nginx 2. εγκατέστησε php-fpm 3. βάλε το php-fpm upstream στο nginx 4. ενεργοποίησε caching sto nginx Με αυτόν τον τρόπο, αν για παράδειγμα βάλεις το cache ttl στα 15 δευτερόλεπτα το server σου θα χτυπάει την database και θα εκτελεί το php μια φορά κάθε 15 δευτερόλεπτα και ας έχεις εσύ 1000 επισκέπτες ανά δευτερόλεπτο. Έτσι θα έχεις πολύ υψηλότερη απόδοση με το ίδιο server. 1
alou Δημοσ. 6 Μαρτίου 2018 Δημοσ. 6 Μαρτίου 2018 Δεν είμαι ειδικός αλλά μπορώ να σου πω ότι δεν υπάρχει κάτι γενικό που θα βοηθήσει σε κάθε περίπτωση. Το my.cnf και το max_connections αφορά τη mysql, το 500 σημαίνει live connections σε οποιαδήποτε συγκεκριμένη χρονική στιγμή (running database requests, όχι χρήστες). Λίγο απλοϊκά, μπορείς να το σκεφτείς κάπως έτσι: Το πόσους χρήστες μπορείς να εξυπηρετήσεις το δευτερόλεπτο, εξαρτάται από το μέσο χρονικό διάστημα X που χρειάζεται ένα request για να ολοκληρωθεί, δηλαδή ας πούμε χοντρικά 500 / X με την τρέχουσα ρύθμισή σου. Το πόσα max_connections πρέπει να έχεις, εξαρτάται από το peak χρηστών σου και το response time της βάσης ή το max connections που έχει καταγραφεί από κάποιο log (+ένα μικρό ποσοστό). Το πόσα max_connections μπορείς να έχεις, εξαρτάται από το πόσο memory intensive είναι το request και τη διαθέσιμη μνήμη του server, γιατί πολύ απλά αν δε σκάσει η βάση λόγω max connections, θα σκάσει ο σέρβερ γιατί δεν έχει μνήμη να εξυπηρετήσει. 1
leonidas_fs Δημοσ. 6 Μαρτίου 2018 Δημοσ. 6 Μαρτίου 2018 Πες μας λίγο τα χαρακτηριστκά του server σου (RAM/CPU) και επίσης δείξε μας και το configuration του my.cnf αρχείου!
philos Δημοσ. 8 Μαρτίου 2018 Μέλος Δημοσ. 8 Μαρτίου 2018 Λοιπόν παιδιά, ο server λειτουργεί με cloudlets. Απ' ότι βλέπω το memory limit είναι τα 8GB. Από εκεί και ύστερα δε ξέρω πόση CPU έχει "όριο". Νομίζω κάπου στα 25GHz πρέπει να έχει όριο. Το θέμα είναι ότι, παρά το ότι αλλάχτηκε το max_connections, ανά διαστήματα εξακολουθεί γίνεται το εξής: το site δεν ανοίγει για 5 - 7 λεπτά και σε αυτό το διάστημα ανεβαίνουν τα cloudlets σε χρήση (φτάνουν και 30/ από 64). Μετά ξαφνικά επανέρχεται και τα cloudlets επανέρχονται στα κανονικά τους (7/64). Σας παραθέτω το my.cnf: Καμιά ιδέα σχετικά με το πως μπορώ να καταλάβω τι φταίει; Αναφορά σε κείμενο [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql innodb_use_native_aio = off pid-file=/var/lib/mysql/mysqld.pid # Default to using old password format for compatibility with mysql 3.x # clients (those using the mysqlclient10 compatibility package). old_passwords=0 skip-external-locking key_buffer_size = 2048M max_allowed_packet = 1024M max_connections = 500 table_open_cache = 256 sort_buffer_size = 64K myisam_sort_buffer_size = 2730M read_buffer_size = 256K read_rnd_buffer_size = 256K net_buffer_length = 2K thread_stack = 240K skip-name-resolve #skip-networking server-id = 1 #log-bin=mysql-bin #binlog_format=mixed innodb_buffer_pool_size = 4096M #aria-pagecache-buffer-size = 60M #aria-sort-buffer-size = 40M #aria-log-file-size = 10M ignore_db_dirs=.ssh lc_messages_dir = /usr/share/mysql/ # Disabling symbolic-links is recommended to prevent assorted security risks; # to do so, uncomment this line: # symbolic-links=0 [mysqld_safe] log-error=/var/log/mysql/mysqld.log
ajaxmonkey4hire Δημοσ. 8 Μαρτίου 2018 Δημοσ. 8 Μαρτίου 2018 τι είναι αυτό που κάνει η εφαρμογή σου; πολλούς υπολογισμούς; πολλά db operations;
philos Δημοσ. 8 Μαρτίου 2018 Μέλος Δημοσ. 8 Μαρτίου 2018 Τι να σου πω, ένα vBulletin forum είναι (PHP/ MySQL).
ajaxmonkey4hire Δημοσ. 8 Μαρτίου 2018 Δημοσ. 8 Μαρτίου 2018 γιατί χρησιμοποιεί cloudlets; αυτά είναι σχεδιασμένα για άλλες δουλειές. Ένα απλό nginx server + mariadb + php-fpm + caching και μπορείς άνετα να έχεις πάνω από 500 concurent connections σε ένα server με 8GB RAM. Τι είδους setup τρέχεις;
philos Δημοσ. 8 Μαρτίου 2018 Μέλος Δημοσ. 8 Μαρτίου 2018 Παιδιά, έτσι είναι το πακέτο της εταιρείας (cloud computing) και ουσιαστικά πληρώνω ανάλογα με τα cloudlets που χρησιμοποιώ. Το θέμα μας δεν είναι αυτό, αλλά το να διορθωθεί το πρόβλημα που ανεβαίνει η χρήση και δεν εξυπηρετεί κόσμο -> μετά επανέρχεται και πέφτει η χρήση των cloudlets που περιέγραψα. Είμαι σε επικοινωνία φυσικά με τον υπεύθυνο της εταιρείας, απλά ψάχνω παράλληλα κι άλλη βοήθεια, μήπως έχετε καμιά ιδέα.
ajaxmonkey4hire Δημοσ. 8 Μαρτίου 2018 Δημοσ. 8 Μαρτίου 2018 με άλλα λόγια: έχεις service subscription πηγαίνεις λοιπόν στο support του service provider μιας και δεν μπορείς να κάνεις και πολλές αλλαγές στο setup.
leonidas_fs Δημοσ. 8 Μαρτίου 2018 Δημοσ. 8 Μαρτίου 2018 Επίσης αν θελεις ανέβασε λίγο την τιμή του innodb_buffer_pool_size = 4096M αλλα όχι πάνω απο 80% της συνολικης σου μνήμης!
mad-proffessor Δημοσ. 9 Μαρτίου 2018 Δημοσ. 9 Μαρτίου 2018 Το πιο πιθανό είναι να κρατάει τα php session variables στη βάση και αυτό δημιουργεί το φόρτο, βάλε ένα memcache να αποθηκεύονται και θα λυθεί το πρόβλημα.
CyberCr33p Δημοσ. 9 Μαρτίου 2018 Δημοσ. 9 Μαρτίου 2018 500 ταυτόχρονες συνδέσεις τη βάση είναι πολλές και θα δημιουργηθούν άλλα προβλήματα (π.χ. υπερβολική χρήση RAM). Καλύτερα να δεις γιατί η εφαρμογή σου χρειάζεται τόσες πολλές ώστε να διορθώσεις το πρόβλημα. Ακόμα και χιλιάδες επισκέπτες να έχεις ταυτόχρονα δεν θα έπρεπε να χρειάζονται πάνω από 50 ταυτόχρονες συνδέσεις στη βάση. 1
ajaxmonkey4hire Δημοσ. 9 Μαρτίου 2018 Δημοσ. 9 Μαρτίου 2018 Ναι. Μια καλή optimized εφαρμογή δεν χρειάζεται πάνω από 50 db connections για να εξυπηρετήσει γύρω στης 3000 concurrent page views. Το "Brute Force approach" δεν είναι λύση.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα