[Mysql] Gestion de la mémoire
6 messages
• Page 1 sur 1
-

RiPSO - WRInaute passionné

- Messages: 1591
- Inscription: 4 Oct 2007
[Mysql] Gestion de la mémoire
Salut 
Je me suis décidé à essayer de mieux gérer mes accès à mes bdd mysql histoire d'optimiser un peu mes projets et je bloque sur un point : l'utilisation de la mémoire...
J'ai découvert le moteur MEMORY qui aurait pu être intéressant mais qui ne correspond pas à mes attentes car je ne peux pas y mettre de champ type text... Tant qu'à faire j'aurais aussi apprécié que les données ne se perdent pas a chaque relancement du serveur mais à la limite il suffit de recharger les données en mémoire...
Ce que je cherche en fait c'est que ma table soit dans la mémoire RAM et sur le disque dur :
- pour un select ça doit lire en RAM,
- pour un insert ou autre update ça doit faire les modifs en RAM et sur HD
Il faudrait que je puisse gérer quelle table je souhaite placer en RAM.
Quelqu'un pourrait m'éclairer un peu svp?
Je me suis décidé à essayer de mieux gérer mes accès à mes bdd mysql histoire d'optimiser un peu mes projets et je bloque sur un point : l'utilisation de la mémoire...
J'ai découvert le moteur MEMORY qui aurait pu être intéressant mais qui ne correspond pas à mes attentes car je ne peux pas y mettre de champ type text... Tant qu'à faire j'aurais aussi apprécié que les données ne se perdent pas a chaque relancement du serveur mais à la limite il suffit de recharger les données en mémoire...
Ce que je cherche en fait c'est que ma table soit dans la mémoire RAM et sur le disque dur :
- pour un select ça doit lire en RAM,
- pour un insert ou autre update ça doit faire les modifs en RAM et sur HD
Il faudrait que je puisse gérer quelle table je souhaite placer en RAM.
Quelqu'un pourrait m'éclairer un peu svp?
- jcaron
- WRInaute accro

- Messages: 2685
- Inscription: 13 Fév 2004
Re: [Mysql] Gestion de la mémoire
Ce que tu veux c'est un cache, et, miracle, joie, bonheur, et félicité, il se trouve que tous les OS décents implémentent ça depuis de années. Si ta table tient en RAM et qu'elle est fréquemment accédée elle devrait y rester en permanence, pas de souci de ce côté-là.
Après, tu peux avoir le problème que ce n'est pas tellement l'accès disque qui pose problème, mais l'overhead de la requête SQL (préparation de la requête, transmission réseau -même si c'est en local- parsing de la requête, exécution du plan, tris, etc.). Dans ce cas tu peux avoir intérêt à utiliser un cache "plus près" de ton code PHP, soit local (nombreuses options), soit réparti (comme memcached).
Jacques.
Après, tu peux avoir le problème que ce n'est pas tellement l'accès disque qui pose problème, mais l'overhead de la requête SQL (préparation de la requête, transmission réseau -même si c'est en local- parsing de la requête, exécution du plan, tris, etc.). Dans ce cas tu peux avoir intérêt à utiliser un cache "plus près" de ton code PHP, soit local (nombreuses options), soit réparti (comme memcached).
Jacques.
-

RiPSO - WRInaute passionné

- Messages: 1591
- Inscription: 4 Oct 2007
Re: [Mysql] Gestion de la mémoire
Merci pour ta réponse j'avais l'impression de demander un truc impossible ou alors d'avoir sorti une grosse bêtise 
ok donc en fait je sais pas si je me suis bien fait comprendre
ce que je veux c'est être sur que ma table soit en RAM, pouvoir aussi choisir quelle table doit l'être.
Un système de cache, à part si je n'ai pas compris l'intérêt, ne me parait pas convenir vu que les données devront être modifiées, ou insérées. A savoir aussi les requêtes ne seront jamais les mêmes (donc pas possible de mettre en cache un résultat).
en fait ce que je souhaite c'est que ça fonctionne comme d'habitude mais que les tables soient lues exclusivement en RAM pour accélérer les temps de lecture des données.
Dis moi direct si j'ai mal compris surtout car je m'aventure dans un truc que je ne connais pas
Pour l'instant la seule solution que j'ai trouvé c'est de continuer à utiliser mysql comme je le fais jusqu'à maintenant mais en plus me créer un petit serveur en python qui mettra mes bases en RAM. Et en gros : au lancement du serveur ca charge les bases, et ensuite faire la lecture que via ce serveur, et l'écriture se fera via mysql et aussi via ce serveur.
Je sais qu'en python je sais le faire mais j'aurais aimé savoir si mysql pouvais gérer un truc spécifique comme ça car à part des variables d'allocation de mémoire j'ai rien trouvé pour gérer ça sur une table précise
ok donc en fait je sais pas si je me suis bien fait comprendre
ce que je veux c'est être sur que ma table soit en RAM, pouvoir aussi choisir quelle table doit l'être.
Un système de cache, à part si je n'ai pas compris l'intérêt, ne me parait pas convenir vu que les données devront être modifiées, ou insérées. A savoir aussi les requêtes ne seront jamais les mêmes (donc pas possible de mettre en cache un résultat).
en fait ce que je souhaite c'est que ça fonctionne comme d'habitude mais que les tables soient lues exclusivement en RAM pour accélérer les temps de lecture des données.
Dis moi direct si j'ai mal compris surtout car je m'aventure dans un truc que je ne connais pas
Pour l'instant la seule solution que j'ai trouvé c'est de continuer à utiliser mysql comme je le fais jusqu'à maintenant mais en plus me créer un petit serveur en python qui mettra mes bases en RAM. Et en gros : au lancement du serveur ca charge les bases, et ensuite faire la lecture que via ce serveur, et l'écriture se fera via mysql et aussi via ce serveur.
Je sais qu'en python je sais le faire mais j'aurais aimé savoir si mysql pouvais gérer un truc spécifique comme ça car à part des variables d'allocation de mémoire j'ai rien trouvé pour gérer ça sur une table précise
- jcaron
- WRInaute accro

- Messages: 2685
- Inscription: 13 Fév 2004
Re: [Mysql] Gestion de la mémoire
Des caches, il y en a à de nombreux niveaux. Le premier cache dont je parlais c'est celui de l'OS, qui travaille au niveaux de blocs de données du disque: chaque fois qu'un bloc est lu, une copie est conservée en mémoire. S'il est écrit, il est modifié sur disque, et la copie en mémoire est modifiée aussi. Et ça reste en mémoire tant que l'OS n'a pas besoin de RAM pour d'autres choses (des processus ou pour mettre en cache d'autres données qui lui paraissent plus souvent utilisées).
Si tu veux être à peu près certain que ta table est en mémoire, il te suffit de faire régulièrement un "select * from table" qui va lire toute la table (mais pas forcément les index qui vont avec qui pourraient être utilisées lors des requêtes qui t'intéressent), et hop, ce sera chargé en RAM, ou si c'est déjà chargé, les compteurs LRU seront rafraichis pour éviter que les pages correspondantes soient ejectées de la RAM au profit d'autre chose. Pour les index c'est un peu plus délicat, mais il suffit de faire un truc genre cat nom_du_fichier >/dev/null et ça aura le même effet.
Bref, si tu as assez de RAM, il y a virtuellement rien ou peu de chose à faire. Si tu n'en as pas assez, il t'en faut plus.
Jacques.
Si tu veux être à peu près certain que ta table est en mémoire, il te suffit de faire régulièrement un "select * from table" qui va lire toute la table (mais pas forcément les index qui vont avec qui pourraient être utilisées lors des requêtes qui t'intéressent), et hop, ce sera chargé en RAM, ou si c'est déjà chargé, les compteurs LRU seront rafraichis pour éviter que les pages correspondantes soient ejectées de la RAM au profit d'autre chose. Pour les index c'est un peu plus délicat, mais il suffit de faire un truc genre cat nom_du_fichier >/dev/null et ça aura le même effet.
Bref, si tu as assez de RAM, il y a virtuellement rien ou peu de chose à faire. Si tu n'en as pas assez, il t'en faut plus.
Jacques.
-

RiPSO - WRInaute passionné

- Messages: 1591
- Inscription: 4 Oct 2007
Re: [Mysql] Gestion de la mémoire
Ok je vais faire mes tests en trifouillant les variables de mon ma machine en local déjà pour voir.
Sans avoir fait de modif pour l'instant ça ne reste pas en mémoire donc j'imagine que je n'ai pas encore bien configuré les variables :

Mon serveur à 8Go de RAM que je ne pense pas encore exploiter à fond donc j'ai un peu de marge...
Merci pour ton point de vue, je reviens donner les conclusions de mes tests plus tard
Sans avoir fait de modif pour l'instant ça ne reste pas en mémoire donc j'imagine que je n'ai pas encore bien configuré les variables :

Mon serveur à 8Go de RAM que je ne pense pas encore exploiter à fond donc j'ai un peu de marge...
Merci pour ton point de vue, je reviens donner les conclusions de mes tests plus tard
-

RiPSO - WRInaute passionné

- Messages: 1591
- Inscription: 4 Oct 2007
Re: [Mysql] Gestion de la mémoire
Bon bin ça ne fonctionne pas...
j'ai mis :
key_buffer = 512M
tmp_table_size = 512M
(ma machine locale tourne avec 1,5Go de RAM)
Et rien, la RAM se revide à chaque fois que ma requête est terminée (la requête charge une table de 170Mo)
voici les valeurs des variables :
j'ai mis :
key_buffer = 512M
tmp_table_size = 512M
(ma machine locale tourne avec 1,5Go de RAM)
Et rien, la RAM se revide à chaque fois que ma requête est terminée (la requête charge une table de 170Mo)
voici les valeurs des variables :
- Code: Tout sélectionner
Variable Valeur pour la session / Valeur globale
auto increment increment 1
auto increment offset 1
automatic sp privileges ON
back log 50
basedir /usr/
binlog cache size 32 768
bulk insert buffer size 8 388 608
character set client utf8
(Valeur globale) latin1
character set connection utf8
(Valeur globale) latin1
character set database latin1
character set filesystem binary
character set results utf8
(Valeur globale) latin1
character set server latin1
character set system utf8
character sets dir /usr/share/mysql/charsets/
collation connection utf8_general_ci
(Valeur globale) latin1_swedish_ci
collation database latin1_swedish_ci
collation server latin1_swedish_ci
completion type 0
concurrent insert 1
connect timeout 10
datadir /var/lib/mysql/
date format %Y-%m-%d
datetime format %Y-%m-%d %H:%i:%s
default week format 0
delay key write ON
delayed insert limit 100
delayed insert timeout 300
delayed queue size 1 000
div precision increment 4
keep files on create OFF
engine condition pushdown OFF
expire logs days 10
flush OFF
flush time 0
ft boolean syntax + -><()~*:""&|
ft max word len 84
ft min word len 4
ft query expansion limit 20
ft stopword file (built-in)
group concat max len 1 024
have archive YES
have bdb NO
have blackhole engine YES
have compress YES
have crypt YES
have csv YES
have dynamic loading YES
have example engine NO
have federated engine DISABLED
have geometry YES
have innodb YES
have isam NO
have merge engine YES
have ndbcluster DISABLED
have openssl DISABLED
have ssl DISABLED
have query cache YES
have raid NO
have rtree keys YES
have symlink YES
hostname PC
init connect
init file
init slave
innodb additional mem pool size 1 048 576
innodb autoextend increment 8
innodb buffer pool awe mem mb 0
innodb buffer pool size 8 388 608
innodb checksums ON
innodb commit concurrency 0
innodb concurrency tickets 500
innodb data file path ibdata1:10M:autoextend
innodb data home dir
innodb adaptive hash index ON
innodb doublewrite ON
innodb fast shutdown 1
innodb file io threads 4
innodb file per table OFF
innodb flush log at trx commit 1
innodb flush method
innodb force recovery 0
innodb lock wait timeout 50
innodb locks unsafe for binlog OFF
innodb log arch dir
innodb log archive OFF
innodb log buffer size 1 048 576
innodb log file size 5 242 880
innodb log files in group 2
innodb log group home dir ./
innodb max dirty pages pct 90
innodb max purge lag 0
innodb mirrored log groups 1
innodb open files 300
innodb rollback on timeout OFF
innodb support xa ON
innodb sync spin loops 20
innodb table locks ON
innodb thread concurrency 8
innodb thread sleep delay 10 000
interactive timeout 28 800
join buffer size 131 072
key buffer size 536 870 912
key cache age threshold 300
key cache block size 1 024
key cache division limit 100
language /usr/share/mysql/english/
large files support ON
large page size 0
large pages OFF
lc time names en_US
license GPL
local infile ON
locked in memory OFF
log OFF
log bin OFF
log bin trust function creators OFF
log error
log queries not using indexes OFF
log slave updates OFF
log slow queries OFF
log warnings 1
long query time 10
low priority updates OFF
lower case file system OFF
lower case table names 0
max allowed packet 16 777 216
max binlog cache size 4 294 963 200
max binlog size 104 857 600
max connect errors 10
max connections 500
max delayed threads 20
max error count 64
max heap table size 16 777 216
max insert delayed threads 20
max join size 18446744073709551615
max length for sort data 1 024
max prepared stmt count 16 382
max relay log size 0
max seeks for key 4 294 967 295
max sort length 1 024
max sp recursion depth 0
max tmp tables 32
max user connections 0
max write lock count 4 294 967 295
multi range count 256
myisam data pointer size 6
myisam max sort file size 2 146 435 072
myisam recover options BACKUP
myisam repair threads 1
myisam sort buffer size 8 388 608
myisam stats method nulls_unequal
ndb autoincrement prefetch sz 1
ndb force send ON
ndb use exact count ON
ndb use transactions ON
ndb cache check time 0
ndb connectstring
net buffer length 16 384
net read timeout 30
net retry count 10
net write timeout 60
new OFF
old passwords OFF
open files limit 4 510
optimizer prune level 1
optimizer search depth 62
pid file /var/run/mysqld/mysqld.pid
plugin dir
port 3 306
preload buffer size 32 768
profiling OFF
profiling history size 15
protocol version 10
query alloc block size 8 192
query cache limit 1 048 576
query cache min res unit 4 096
query cache size 536 870 912
query cache type ON
query cache wlock invalidate OFF
query prealloc size 8 192
range alloc block size 4 096
read buffer size 131 072
read only OFF
read rnd buffer size 262 144
relay log
relay log index
relay log info file relay-log.info
relay log purge ON
relay log space limit 0
rpl recovery rank 0
secure auth OFF
secure file priv
server id 0
skip external locking ON
skip networking OFF
skip show database OFF
slave compressed protocol OFF
slave load tmpdir /tmp/
slave net timeout 3 600
slave skip errors OFF
slave transaction retries 10
slow launch time 2
socket /var/run/mysqld/mysqld.sock
sort buffer size 2 097 144
sql big selects ON
sql mode
sql notes ON
sql warnings OFF
ssl ca
ssl capath
ssl cert
ssl cipher
ssl key
storage engine MyISAM
sync binlog 0
sync frm ON
system time zone CEST
table cache 2 000
table lock wait timeout 50
table type MyISAM
thread cache size 8
thread stack 131 072
time format %H:%i:%s
time zone SYSTEM
timed mutexes OFF
tmp table size 536 870 912
tmpdir /tmp
transaction alloc block size 8 192
transaction prealloc size 4 096
tx isolation REPEATABLE-READ
updatable views with limit YES
version 5.0.75-0ubuntu10.2
version comment (Ubuntu)
version compile machine i486
version compile os debian-linux-gnu
wait timeout 28 800
6 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- Gestion des erreurs Mysql
- Gestion commerciale en PHP / MySQL
- Transactions MySql et gestion des erreurs
- [script] Relatif à Mysql (gestion d'erreur, etc.)
- Cherche systeme de gestion de portail PHP/MYSQL
- Reprise gestion de site et aide formulaire insertion mysql
- Recherche Appli PHP/MYSQL Gestion Demande Informatique
- Gestion des langues et des sessions en PHP / MySQL
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité
