Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα!

Αναζητώ τις προτάσεις σας από ειδικούς σε θέματα παραμετροποίησης 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 κτλ έχουν πολλές παραμέτρους. :)

 

Επεξ/σία από philos
Δημοσ.

Μπορείς να αυξήσεις την ταχύτητα τουλάχιστον 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.

 

  • Like 1
Δημοσ.

Δεν είμαι ειδικός αλλά μπορώ να σου πω ότι δεν υπάρχει κάτι γενικό που θα βοηθήσει σε κάθε περίπτωση.

Το 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, θα σκάσει ο σέρβερ γιατί δεν έχει μνήμη να εξυπηρετήσει.

 

 

  • Like 1
Δημοσ.

Πες μας λίγο τα χαρακτηριστκά του server σου (RAM/CPU) και επίσης δείξε μας και το configuration του my.cnf αρχείου!

Δημοσ.

Λοιπόν παιδιά, ο 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

 

Δημοσ.

γιατί χρησιμοποιεί cloudlets; αυτά είναι σχεδιασμένα για άλλες δουλειές.

Ένα απλό nginx server + mariadb + php-fpm + caching και μπορείς άνετα να έχεις πάνω από 500 concurent connections σε ένα server με 8GB RAM.

Τι είδους setup τρέχεις;

Δημοσ.

Παιδιά, έτσι είναι το πακέτο της εταιρείας (cloud computing) και ουσιαστικά πληρώνω ανάλογα με τα cloudlets που χρησιμοποιώ.

 

Το θέμα μας δεν είναι αυτό, αλλά το να διορθωθεί το πρόβλημα που ανεβαίνει η χρήση και δεν εξυπηρετεί κόσμο -> μετά επανέρχεται και πέφτει η χρήση των cloudlets που περιέγραψα.

Είμαι σε επικοινωνία φυσικά με τον υπεύθυνο της εταιρείας, απλά ψάχνω παράλληλα κι άλλη βοήθεια, μήπως έχετε καμιά ιδέα. :)

Δημοσ.

με άλλα λόγια: έχεις service subscription 

πηγαίνεις λοιπόν στο support του service provider μιας και δεν μπορείς να κάνεις και πολλές αλλαγές στο setup.

Δημοσ.

Επίσης αν θελεις ανέβασε λίγο την τιμή του innodb_buffer_pool_size = 4096M αλλα όχι πάνω απο 80% της συνολικης σου μνήμης!

Δημοσ.

Το πιο πιθανό είναι να κρατάει τα php session variables στη βάση και αυτό δημιουργεί το φόρτο, βάλε ένα memcache να αποθηκεύονται και θα λυθεί το πρόβλημα. 

Δημοσ.

500 ταυτόχρονες συνδέσεις τη βάση είναι πολλές και θα δημιουργηθούν άλλα προβλήματα (π.χ. υπερβολική χρήση RAM). Καλύτερα να δεις γιατί η εφαρμογή σου χρειάζεται τόσες πολλές ώστε να διορθώσεις το πρόβλημα. Ακόμα και χιλιάδες επισκέπτες να έχεις ταυτόχρονα δεν θα έπρεπε να χρειάζονται πάνω από 50 ταυτόχρονες συνδέσεις στη βάση.

  • Like 1
Δημοσ.

Ναι. Μια καλή optimized εφαρμογή δεν χρειάζεται πάνω από 50 db connections για να εξυπηρετήσει γύρω στης 3000 concurrent page views.

Το "Brute Force approach" δεν είναι λύση.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...