3930

donc on peut faire cette copie "virtuelle" sans devoir faire forcément un fork ? ca rulez

mais dans tous les cas la save doit être faite en // pour ne pas être bloquante donc fork() est tout désigné non ?

(en l’occurrence ce n'est pas une simple copie ram -> disque il y à de la compression etc, mais si cela n'avais pas été le cas, aurait' on pu demander au système de faire cette copie de manière asynchrone ?)
Linuxien
wow maintenant je vais devoir me faire pousser la barbe cheeky
et la le mec il le pécho par le bras et il lui dit '

3931

Je te parle plutôt sur le principe ; disons que fork convient mais ce n'est à mon avis qu'une utilisation détournée de l'outil puisque ce dont tu as besoin est seulement l'un de ses effets de bord, à savoir le copy-on-write, et même pas le fork lui-même (processus additionnel ; un thread semble bien plus indiqué pour cette tâche, comme ça pas besoin d'IPC pour savoir quand c'est terminé).
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

3932

Dans ce cas, vive Qt et ses conteneurs qui sont tous automatiquement en copy-on-write. tongue
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3933

./3931 sur le principe oui tu à raison, même si dans le cas présent cela se discute, sauver la base est un truc critique, un processus propre est peut être plus pertinent

./3932 grin en l'occurance c'est sortir le bazooka pour tuer la mouche, redis n'ayant aucune dépendances
et la le mec il le pécho par le bras et il lui dit '

3934

Brunni (./3931) :
Je te parle plutôt sur le principe ; disons que fork convient mais ce n'est à mon avis qu'une utilisation détournée de l'outil puisque ce dont tu as besoin est seulement l'un de ses effets de bord, à savoir le copy-on-write, et même pas le fork lui-même (processus additionnel ; un thread semble bien plus indiqué pour cette tâche, comme ça pas besoin d'IPC pour savoir quand c'est terminé).
C'est en fait une utilisation parfaitement dans l'objectif de fork(), et la raison même pour laquelle fork() existe. Le fait qu'il soit souvent utilisé conjointement à exec n'est que parce que c'est un cas d'usage très fréquent.

La copie n'est pas un effet de bord de fork(), mais précisément son rôle. Fork a pour objectif de créer une copie du processus. C'est également de là que vient le nom de la fonction : le passé du programme se sépare en deux avenirs parallèles, formant une fourche.

Le fait qu'il utilise les fonctionnalités de la MMU pour réaliser cette copie de manière très efficace est un bonus (d'ailleurs, avant que ça soit dispo, fork devait tout recopier pour de vrai et était extrèmement lent, c'est cette époque qui lui a valu la réputation d'être très lent, alors qu'aujourd'hui il est quasiment aussi rapide qu'une création de thread)

Un thread n'est *pas* indiqué pour cette tâche, parce que pendant la sauvegarde, la base de données continue de fonctionner, et est donc modifiée. Si tu réalisais cette tâche dans un thread, soit tu obtiendrais une base de données corrompue, soit tu devrais implémenter toi-même un mécanisme de copy-on-write manuel.

Il n'y a pas besoin d'IPC, parce que le processus de la base de données n'a pas besoin d'être averti de la fin de la sauvegarde, vu qu'il n'est pas affecté par elle.


Enfin, même s'il était possible de demander à l'OS de prendre un instantané et de l'écrire dans un fichier (ce que aucun OS ne permet à ma connaissance), ça ne permettrait pas de réaliser la sauvegarde, car l'OS n'est pas capable de faire une serialization propre des structures mémoire de la base de données.
En dehors des cas triviaux, on ne peut pas se passer d'un code dédié à la sauvegarde et à la restauration.

3935

spectras (./3934) :
Un thread n'est *pas* indiqué pour cette tâche, parce que pendant la sauvegarde, la base de données continue de fonctionner, et est donc modifiée. Si tu réalisais cette tâche dans un thread, soit tu obtiendrais une base de données corrompue, soit tu devrais implémenter toi-même un mécanisme de copy-on-write manuel.
Je pense que l'idée était bien de faire un clone de la base de données avec copie effective lors de la modification et de donner ce clone au processus léger pour qu'il l'archive.
spectras (./3934) :
Il n'y a pas besoin d'IPC, parce que le processus de la base de données n'a pas besoin d'être averti de la fin de la sauvegarde, vu qu'il n'est pas affecté par elle.
J'espère qu'il ne tente pas une nouvelle sauvegarde lorsque la précédente n'est pas terminée.
avatar

3936

spectras (./3934) :
Enfin, même s'il était possible de demander à l'OS de prendre un instantané et de l'écrire dans un fichier (ce que aucun OS ne permet à ma connaissance)

Euh si, GNU/Linux est capable de produire un core dump d'un processus qui tourne. tongue
ça ne permettrait pas de réaliser la sauvegarde, car l'OS n'est pas capable de faire une serialization propre des structures mémoire de la base de données.

Bah, il est possible de réactiver le processus à partir d'un core dump et même à travers GDB d'appeler une fonction d'exportation des données, mais ça reviendrait à une maniére très tordue et inefficace (écriture sur disque, lecture du disque, consommation double de la RAM) de faire un fork().
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3937

RHJPP (./3935) :
J'espère qu'il ne tente pas une nouvelle sauvegarde lorsque la précédente n'est pas terminée.
Je ne vois pas en quoi ça poserait problème.

avatar

3938

Enfin, même s'il était possible de demander à l'OS de prendre un instantané et de l'écrire dans un fichier (ce que aucun OS ne permet à ma connaissance), ça ne permettrait pas de réaliser la sauvegarde, car l'OS n'est pas capable de faire une serialization propre des structures mémoire de la base de données.

Le support kernel nécessaire au checkpoint & restart n'est pas encore intégralement disponible dans Linux mainline, mais des parties significatives de ce support y sont déjà rentrées, tant pour les processes, le réseau (TCP connection repair, etc.) que pour les I/O de masse.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

3939

Uther (./3937) :
RHJPP (./3935) :
J'espère qu'il ne tente pas une nouvelle sauvegarde lorsque la précédente n'est pas terminée.
Je ne vois pas en quoi ça poserait problème.
Je ne sais pas comment ça a été fait, mais il est possible qu'une telle situation pose problème. S'il n'y a qu'un unique fichier de sauvegarde, alors la nouvelle instance se heurtera à un fichier déjà ouvert et bloqué par la précédente. Il y a ce problème même si un fichier temporaire est utilisé pendant la sauvegarde afin de ne pas altérer le dernier fichier complet tant que la nouvelle copie n'est pas complète. Si chaque sauvegarde créait un nouveau fichier, alors les performances du serveur pourraient être dramatiquement diminuées par toutes les instances de sauvegarde en cours. En effet, chaque nouvelle instance ralentirait les précédentes en cours et il existerait un seuil du rapport taille de la sauvegarde sur intervalle entre les sauvegardes à partir duquel le nombre d'instances ne ferait qu'augmenter au cours du temps. Mais il est peu probable qu'il y ait un fichier par sauvegarde car la taille occupée sur le disque serait un peu trop énorme.

On peut imaginer, pour éviter ces problèmes, de simplement annuler une sauvegarde lorsque le fichier est déjà bloqué par une autre instance. Mais on s'exposerait dans ce cas au risque de ne plus jamais faire de sauvegarde si l'une des instances venait à planter. On n'aurait pas de moyen de savoir si le fichier est bloqué par la dernière instance ou bien s'il est bloqué depuis 3 jours... La vraie solution est de faire communiquer les processus et de prévoir des mécanismes d'arrêt après une durée maximale de fonctionnement.
avatar

3940

L'autre solution est de ne pas enregistrer tout changement intervenu après le démarrage d'une duplication, mais de l'archiver dans des logs transactionnels indexables (et donc accessibles par le processus de façon transparente - avec probablement des performances moindres à ce moment-là) ; une fois la sauvegarde terminée, on impacte les fichiers de données en exécutant réellement les logs transactionnels en attente.
Si je ne m'abuse, il me semble que c'est le principe utilisé par BerkeleyDB.
avatar

3941

Ca me paraît beaucoup plus propre également, c'est comme ça que j'aurais fait intuitivement en tous cas.
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

3942

Il suffit de sauvegarder moins souvent que la durée de la sauvegarde. Si on estime que la sauvegarde durera 10 ms au maximum, on sauvegarde toutes les 60 secondes et on est tranquille.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3943

10 ms pour sauvegarder 10 Go ? Quand on arrive à ces volumes, on devrait s'abstenir de faire des prévisions, et la marge nécessaire rendrait les sauvegardes trop rares. Mais de toute façon, ça n'empêche pas de s'assurer que la sauvegarde finit correctement car le fichier pourrait être bloqué sans qu'on ne puisse savoir pourquoi au moment de sauvegarder.
avatar

3944

./3941 > pencil
J'étais d'ailleurs parti sur une architecture de ce type pour un projet perso à un moment. (Ensuite j'ai abandonné cette piste pour d'autres raisons (entre autres #flemme#) mais ça c'est une autre histoire tongue)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

3945

Kevin Kofler (./3942) :
Il suffit de sauvegarder moins souvent que la durée de la sauvegarde. Si on estime que la sauvegarde durera 10 ms au maximum, on sauvegarde toutes les 60 secondes et on est tranquille.
Bonjour "Monsieur je ne sais pas comment ça se passe dans la vie active"...
Quand on définit une politique de sauvegarde, celle-ci est bien souvent déterminée pour plusieurs années (une architecture de sauvegarde digne de ce nom a un coût assez impressionnant, en général on l'amortit dur 3 à 5 ans) ; il faut donc
- anticiper les dimensionnements (c'est moins pour l'espace disque - qui peut en général assez facilement s'étendre, sauf quand on parle de sauvegarde sur bandes et que le robot a une queue limitée - que pour la durée de la sauvegarde, afin d'éviter que plusieurs sauvegardes de systèmes différents ne se télescopent et ne créent des décalages dans la file d'attente)
- anticiper les fonctionnements non prévus (la sauvegarde, c'est un élément critique du système qui a cette particularité de ne devenir critique que quand on en a besoin ; on doit donc s'assurer qu'elle va bien fonctionner même si on n'en vérifie pas le bon fonctionnement tous les jours, son déroulement devant être le plus transparent par l'utilisateur) : a minima, prévoir un système complémentaire en cas de débordement de capacité (temps et espace disque) qui permette de se dégager du temps pour trouver une extension propre du système arrivé au bout de ses limites, et avoir une politique de priorisation ou de parallélisation lorsque deux processus de sauvegarde doivent démarrer de façon concomitante (la politique va dépendre de la technologie utilisée : on ne fait pas les mêmes choix sur bandes, sur disque, ou sur bande+disque).

En outre, ton analyse ne prend pas en compte les problématiques de réplication (ce pourquoi BerkeleyDB est énormément utilisé dans des systèmes où on a besoin de réplications, comme les annuaires LDAP) : plusieurs systèmes esclaves peuvent demander une synchronisation avec le parent alors que la synchronisation du précédent n'est pas terminée. Dans ce cas là, hors de question de dire au second esclave "t'attends encore une heure, tu auras tes données quand j'aurai fini". Le système doit pouvoir proposer une solution (pour BDB, les logs transactionnels sont archivés sans limite sauf opération de maintenance, et l'esclave demande tous les logs depuis le dernier point de synchro ; lorsqu'on purge les logs transactionnels, il faut s'assurer que tous les esclaves sont à jour - mais on peut aussi purger ces fichiers de log jusqu'à un point donné pour s'octroyer une marge de sécurité... on peut estimer, par exemple, qu'un esclave qui n'est pas synchrone depuis plus de n jours est en erreur et qu'il sera plus efficace de refaire une synchro totale par copie des données via une dump de la base qu'une synchro partielle).
Alors c'est sûr qu'on travaille très vite sur de très gros volumes de données (les logs transactionnels montent très vite en taille).
avatar

3946

Avec toutes les histoires que j'ai lues sur TheDailyWTF, j'ai l'impression que tout ça, c'est de la jolie théorie, mais en pratique une sauvegarde, si elle existe, ne marche jamais. gni
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

3947

Heureusement que c'est faux...
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3948

Nil (./3945) :
Bonjour "Monsieur je ne sais pas comment ça se passe dans la vie active"...
avatar

3949

en fait redis à deux type de dump qui peuvent se cumuler

http://redis.io/topics/persistence

* un ou c'est un shoot complet dumpé (en un seul fichier)
* un avec chaque commande exécuté mise dans un fichier pour pouvoir "relire" tout ca en cas de soucis
* un avec les commandes exécuté depuis le dernier dump

le dump total peut être configuré pour être effectué quant au moins N changements ont été effectué en T secondes

le mode "replay des commandes" lui peu être configuré avec un temps de "fsync"

ensuite c'est à l'utilisateur de trouver le bon compromis entre performance et sécurité des donnés

l'auteur de redis à fait un article très complet sur la sécurité des donnés dans redis, assez technique, ou il compare aussi avec PostgreSql
http://oldblog.antirez.com/post/redis-persistence-demystified.html
exemple de commande "info" dans redis
redis 127.0.0.1:6379> info
# Server
redis_version:2.6.10
redis_git_sha1:00000000
redis_git_dirty:0
redis_mode:standalone
os:Linux 2.6.32-5-amd64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.5
process_id:1390
run_id:26757208c632a26d493a4914451c6a6c4e3dfea1
tcp_port:6379
uptime_in_seconds:910508
uptime_in_days:10
lru_clock:2083060

# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:25610360
used_memory_human:24.42M
used_memory_rss:28119040
used_memory_peak:43769496
used_memory_peak_human:41.74M
used_memory_lua:31744
mem_fragmentation_ratio:1.10
mem_allocator:jemalloc-3.2.0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1362993539
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:2
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok

# Stats
total_connections_received:50419
total_commands_processed:288830
instantaneous_ops_per_sec:0
rejected_connections:0
expired_keys:0
evicted_keys:0
keyspace_hits:177381
keyspace_misses:2977
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1331

# Replication
role:master
connected_slaves:0

# CPU
used_cpu_sys:987.58
used_cpu_user:1155.98
used_cpu_sys_children:24.99
used_cpu_user_children:174.72

# Keyspacedb0:keys=7322,expires=0


mis à part ca je suis allé regarder le copy-on-write et je suis très déçu de ne trouver un jolie void* cow(void*); nulle part :- /

et la le mec il le pécho par le bras et il lui dit '

3950

Nil > Il a pas tout-à-fait tort non plus... Ce que tu décris, c'est la démarche d'un admin compétent, mais il y en a malheureusement plein qui ne le sont pas (à commencer par "Une sauvegarde, quelle sauvegarde ?").
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3951

Mouais, ça vaut une fois mais après, une fois que la direction a compris que c'était critique, elle débloque les moyens pour ça...
Après, ce qui est certain, c'est que ce qui est critique pour les uns ne l'est pas pour les autres ("Votre messagerie en local ? Ben non, elle n'est pas sauvegardée par nos moyens, c'est pas critique, et si vous voulez la sauvegarder, c'est à votre charge !").
avatar

3952

Mouerf :/
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3953

Tu dis ça parce que tu bosses dans une grosse boîte (bon c'est pas une boîte mais c'est pareil), mais dans les moins grosses quand la direction comprend que c'était nécessaire, il est souvent trop tard pour rattrapper les dégâts tongue
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3954

Ho oui grin
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

3955

RHJPP (./3935) :
Je pense que l'idée était bien de faire un clone de la base de données avec copie effective lors de la modification et de donner ce clone au processus léger pour qu'il l'archive.
fork()
Opérationn terminée. Il n'est pas besoin de faire autre chose, fork() crée un clone instantanément. Le nouveau processus sauvegarde tranquillement la base, en ayant la garantie qu'elle ne bougera pas. Pendant ce temps, l'autre processus continue d'utiliser la base comme d'habitude. Chacun a la sienne, indépendante de l'autre.
RHJPP (./3935) :
J'espère qu'il ne tente pas une nouvelle sauvegarde lorsque la précédente n'est pas terminée.
Si.
Non seulement il tente, mais ça fonctionne très bien.
RHJPP (./3939) :
'il n'y a qu'un unique fichier de sauvegarde
Non. Jamais. Parce que si ton serveur plante pendant la sauvegarde (coupure de courant par exemple), tu perds toutes tes données.


Enfin, j'ai le sentiment que le fonctionnement de fork() est un mystère pour beaucoup de monde. Depuis une page maintenant, il y a des incompréhensions quant au mécanisme de sauvegarde de redis. Rien que le petit cite au début de ce post montre que le mécanisme de fork() n'est pas compris par RHJPP (sans animosité aucune, c'est normal de ne pas connaître quand on ne développe pas sous unix). C'est juste que comparer fork() et les threads quand on ne sait pas comment l'un des deux fonctionne, c'est compliqué.

3956

0² > Oh, mais ça arrive toujours trop tard la première fois grin Mais (en règle générale) ça n'arrive qu'une fois. Bon, ok, parfois 2 cheeky
avatar

3957

Ben si la boîte coule, ça n'arrive qu'une fois, en effet tongue
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3958

Non mais faut le vouloir pour *tout* perdre, surtout aujourd'hui où les gens se promènent bien souvent avec les archives des données sur trois générations dans leur ordi portable embarrassed
avatar

3959

Pourtant ça s'est déjà produit, et ça se produit encore.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

3960

spectras (./3955) :
fork() Opérationn terminée. Il n'est pas besoin de faire autre chose, fork() crée un clone instantanément. Le nouveau processus sauvegarde tranquillement la base, en ayant la garantie qu'elle ne bougera pas. Pendant ce temps, l'autre processus continue d'utiliser la base comme d'habitude. Chacun a la sienne, indépendante de l'autre.
Heu et alors ? Je t'explique seulement ce que tu n'avais visiblement pas compris dans l'intervention de Brunni, qu'il était sous-entendu que le clonage était de toute façon nécessaire lors de l'utilisation de processus légers et que l'usage d'une méthode à copie effective lors de la modification est ce qu'on attend de ce clonage.
RHJPP (./3935) :
J'espère qu'il ne tente pas une nouvelle sauvegarde lorsque la précédente n'est pas terminée.
Si. Non seulement il tente, mais ça fonctionne très bien.
Ha oui, doubler voir plus le trafic vers le disque parce que tu as été incapable de voir qu'une sauvegarde était déjà en cours, et par conséquent compromettre les performances de ton serveur ne te dérange pas ?
RHJPP (./3939) :
'il n'y a qu'un unique fichier de sauvegarde
Non. Jamais. Parce que si ton serveur plante pendant la sauvegarde (coupure de courant par exemple), tu perds toutes tes données.
Ce paragraphe ne se limite pas à une phrase. Ha ho tiens, la phrase suivante elle disait quoi en fait ?
Rien que le petit cite au début de ce post montre que le mécanisme de fork() n'est pas compris par RHJPP
Ouais, ça montre surtout que toi t'as rien compris de la discussion. Brunni ne parlait pas de fork lui-même, mais de ce par quoi il aurait pu être remplacé pour effectuer la sauvegarde. Je répondais seulement là-dessus.
(sans animosité aucune, c'est normal de ne pas connaître quand on ne développe pas sous unix)
Ce serait bien d'essayer de comprendre ce que disent les autres quand ça te semble aussi idiot (bah oui, peut-être que t'as pas compris un truc) au lieu de les prendre pour des demeurés.
C'est juste que comparer fork() et les threads quand on ne sait pas comment l'un des deux fonctionne, c'est compliqué.
Pourquoi parlerait-on de remplacer les uns par les autres alors ? Juste pour le plaisir d'une discussion dépourvue de sens ?
avatar