Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

LOCK_EX vs LOCK_SH

25 réponses
Avatar
Sébastien Cottalorda
Bonjour a tous,

J'ai developp=E9 un contr=F4le d'acc=E8s pour g=E9rer les entr=E9es/sorties=
de
parkings.

Le noyau du syst=E8me (qui doit =EAtre temps r=E9el) travaille avec le
module IPC::Shareable pour acc=E9der tr=E8s rapidement aux donn=E9es mises
en m=E9moire.

Lorsqu'il y acc=E8de, il locke le(s) segment(s) de m=E9moire partag=E9e
gr=E2ce =E0 un LOCK_EX afin que les donn=E9es qu'il va lire ne soient pas
corrompues durant sa prise de d=E9cision.

Seulement voil=E0 durant le lapse de temps, tous les petits programmes
"clients" qui sont cens=E9 lire le contenue de la m=E9moire afin d'en
afficher le contenue se trouvent fig=E9s jusqu'=E0 la lib=E9ration du lock
ce qui peut =EAtre assez g=E9nant.
Je ne peux pas tous les mettre en LOCK_SH|LOCK_NB sinon ils ne lisent
m=EAme pas le segment puisque cela rend la main tout de suite.

Aussi, je me demandais si le noyau utilisait un LOCK_SH est-ce que
cela ne serait pas mieux ?

En fait, je voudrais id=E9alement que le programme principal puisse lire
et =E9crire, et que les programmes clients puissent seulement lire.

Est-ce que le LOCK_SH pourrait me tirer d'affaire ?

Sinon, comment puis-je r=E9gler ce probl=E8me ?

Merci d'avance pour votre aide.

S=E9bastien

10 réponses

1 2 3
Avatar
Sébastien Cottalorda
On 17 juin, 16:35, (Marc Espie) wrote:
In article ,
Jérémy JUST wrote:

Pour une requête sur la clef du hash, le démon en Perl était plus
rapide d'un facteur 2 à 3. Pour des requêtes ne portant plus sur la
clef du hash, il fallait créer un second hash à côté, ce qui dou blait
presque la RAM utilisée et donnait des performances proches de celles
Postgresql.
La différence principale était au moment du remplissage des
structures: il suffisait de quelques minutes pour remplir le hash avec
les 3 millions d'enregistrements, à partir d'un fichier tabulé, tand is
qu'il fallait une à deux heures pour Postgresql.


Et encore, c'etait avec du postgresql... sur certains types de tables,
je soupconne que sqlite va nettement plus vite, vu qu'il y a moins de
transferts a faire.


D'une manière ou d'une autre, vous ne m'enlèverez pas de l'idée qu'un
système temps réel basé sur des partages en mémoire est beaucoup pl us
performant que tous les systèmes basés sur des fichiers à plats
(indexés ou pas).

Et aussi, penser a virer l'autocommit, et a faire des commits manuels
toutes les 1000 ou 2000 transactions... Ca fait facilement un facteur
dix d'ecart sur la vitesse d'ecriture.


Super, et que se passe t'il si ton système plante au bout de la 999
ème transaction ? ou de la 1999 ième, comment vas-tu expliquer à ton
patron que tu as perdu de l'argent pour une histoire de perfomance ?


Avatar
Jérémy JUST
Le Mon, 18 Jun 2007 07:05:50 -0000,

Voyant ces chiffres, j'ai du mal à imaginer que des
entrées/sorties de parkings puissent saturer l'un ou l'autre des
systèmes.
Tu serais surpris de tout ce qui se passe lorsque tu entres ta carte

de parking .....
C'est un système temps réel beaucoup plus compliqué que tu ne peux
l'imaginer.


Je veux bien te croire, mais pourrais-tu nous donner une estimation
du nombre d'écritures et de lectures par seconde? Et de la complexité
des requêtes?

Je te propose un système qui peut réaliser 500 écritures par seconde
(à la louche; je ne garantis évidemment rien). Il y a bien entendu des
cas de la vie courante qui ont besoin de plus; j'ignorais que la
gestion de parkings entrait dans cette catégorie.


Par contre, utiliser un SGBD te soulagerait de bien des soucis pour
les verrouillages et le partage entre processus.
Je ne suis pas d'accord, même pour une SGBD tu as a gérer des locks

exclusifs ou non.


Oui, mais le SGBD lui-même te fournit des outils pour ça. Et leur
mise en oeuvre fait tellement partie de la bonne utilisation du SGBD
qu'on ne se pose que rarement des question à leur sujet.


Tu ne fais que reporter le problème sur la SGBD, mais comment crois-tu
qu'elle gère les lock de tables ?


Dans le cadre d'un projet de développement, ce n'est pas mon
problème, puisque tout est fait pour que ça marche simplement et
efficacement.

Cette question est plus de l'ordre de la culture personnelle. Et pour
être honnête, je n'en sais rien (je note qu'il faudra creuser ça à
l'occasion).

--
Jérémy JUST


Avatar
Sébastien Cottalorda
On 18 juin, 09:49, Jérémy JUST wrote:
Le Mon, 18 Jun 2007 07:05:50 -0000,

Voyant ces chiffres, j'ai du mal à imaginer que des
entrées/sorties de parkings puissent saturer l'un ou l'autre des
systèmes.
Tu serais surpris de tout ce qui se passe lorsque tu entres ta carte

de parking .....
C'est un système temps réel beaucoup plus compliqué que tu ne peux
l'imaginer.


Je veux bien te croire, mais pourrais-tu nous donner une estimation
du nombre d'écritures et de lectures par seconde? Et de la complexité
des requêtes?

Je te propose un système qui peut réaliser 500 écritures par seco nde
(à la louche; je ne garantis évidemment rien). Il y a bien entendu des
cas de la vie courante qui ont besoin de plus; j'ignorais que la
gestion de parkings entrait dans cette catégorie.

Par contre, utiliser un SGBD te soulagerait de bien des soucis pour
les verrouillages et le partage entre processus.
Je ne suis pas d'accord, même pour une SGBD tu as a gérer des locks

exclusifs ou non.


Oui, mais le SGBD lui-même te fournit des outils pour ça. Et leur
mise en oeuvre fait tellement partie de la bonne utilisation du SGBD
qu'on ne se pose que rarement des question à leur sujet.

Tu ne fais que reporter le problème sur la SGBD, mais comment crois-tu
qu'elle gère les lock de tables ?


Dans le cadre d'un projet de développement, ce n'est pas mon
problème, puisque tout est fait pour que ça marche simplement et
efficacement.

Cette question est plus de l'ordre de la culture personnelle. Et pour
être honnête, je n'en sais rien (je note qu'il faudra creuser ça à
l'occasion).

--
Jérémy JUST



Tout le système est *déjà* développé.

Il compte environ 50 000 lignes de codes pour la partie noyau de
contrôle d'accès + facturation + administration du système (le tout en
Perl).

La partie interface cliente est en PHP/HTML/Javascript et elle compte
environ 50 000 ligne de codes également.

Je ne va



Avatar
Sébastien Cottalorda
On 18 juin, 11:26, Sébastien Cottalorda
wrote:
On 18 juin, 09:49, Jérémy JUST wrote:



Le Mon, 18 Jun 2007 07:05:50 -0000,

Voyant ces chiffres, j'ai du mal à imaginer que des
entrées/sorties de parkings puissent saturer l'un ou l'autre des
systèmes.
Tu serais surpris de tout ce qui se passe lorsque tu entres ta carte

de parking .....
C'est un système temps réel beaucoup plus compliqué que tu ne p eux
l'imaginer.


Je veux bien te croire, mais pourrais-tu nous donner une estimation
du nombre d'écritures et de lectures par seconde? Et de la complexit é
des requêtes?

Je te propose un système qui peut réaliser 500 écritures par se conde
(à la louche; je ne garantis évidemment rien). Il y a bien entendu des
cas de la vie courante qui ont besoin de plus; j'ignorais que la
gestion de parkings entrait dans cette catégorie.

Par contre, utiliser un SGBD te soulagerait de bien des soucis pour
les verrouillages et le partage entre processus.
Je ne suis pas d'accord, même pour une SGBD tu as a gérer des loc ks

exclusifs ou non.


Oui, mais le SGBD lui-même te fournit des outils pour ça. Et leur
mise en oeuvre fait tellement partie de la bonne utilisation du SGBD
qu'on ne se pose que rarement des question à leur sujet.

Tu ne fais que reporter le problème sur la SGBD, mais comment crois -tu
qu'elle gère les lock de tables ?


Dans le cadre d'un projet de développement, ce n'est pas mon
problème, puisque tout est fait pour que ça marche simplement et
efficacement.

Cette question est plus de l'ordre de la culture personnelle. Et pour
être honnête, je n'en sais rien (je note qu'il faudra creuser ça à
l'occasion).

--
Jérémy JUST


(Désolé le message est parti tout seul)....


Tout le système est *déjà* développé.

Il compte environ 50 000 lignes de codes pour la partie noyau de
contrôle d'accès + facturation + administration du système (le tout en
Perl).

La partie interface cliente est en PHP/HTML/Javascript et elle compte
environ 50 000 ligne de codes également.

Je ne vais pas m'amuser à remettre en cause mon système basé sur la
mémoire partagée à ce stade de développement.

D'autant plus qu'il est déjà en production depuis le début de l'ann ée
2007 et qu'il me donne satisfaction.

Je suis dans la phase d'optimisation et non de conception.

Je me pose juste des questions sur le bon choix en terme de type de
lock.

C'est tout ce que je désire savoir (si quelqu'un a une idée).

Je ne désire pas savoir si j'ai bien ou mal choisi ma technologie, je
voudari juste avoir des infos sur les locks de mémoire.
Cela dit, ils sont les mêmes qu'avec la commande flock (pour les
fichiers à plat)




Avatar
Paul Gaborit
À (at) Fri, 15 Jun 2007 09:45:07 -0000,
Sébastien Cottalorda écrivait (wrote):
Le noyau, selon mes mesures locke au maximum 1 sec le(s) segment(s)
pour chaque évènement.

Hélas, il n'est pas tout seul pour plusieurs raisons:
* Il y a plusieurs parkings à gérer : les évènements lui arrive en
parallèle, en effet, sur le nombre de borne entrée/sortie, il se peut
tout a fait qu'il y ait plusieurs véhicule souhaita,t entrer ou sortie
simultannément.
* Chque prise de décision doit être atomique : lecture + décision
+ écriture ce qui conduit à un lock de ~ 1sec/évènement important
(0,00... sec pour des évènements peu importants),
* Le noyau n'est pas tout seul à écrire dans les segments de
mémoire, même si cela est vrai dans 98% des cas, il faut bien pouvoir
modifier les données permettant le contrôle d'accès : le nom d'un
client, ses données de facturation, ou tout bêtement modifier les
paramètres des équipements sans avoir à relancer tout le système de
contrôle d'accès (on peux faire mieux que Windows n'est-ce pas ?)

Lorsque le système est très chargé, je fini par avoir un embouteillage
au niveau des sémaphores, à ce moment là, tous les processus partent
en timeout.

[...]


Est-ce que j'ai bon ???


Le temps de lock annoncé (1s) me semble énorme. Que fait votre
processus pendant cette longue seconde ? De plus, je ne comprends pas
pourquoi il y aurait (inter)blocage. Quelles sont les données
réellement partagées par tous les processus ? Lorsque je change le nom
d'un client, cela n'a aucun impact sur la contrôle d'accès (sauf dans
le très rare cas où c'est ce client spécifiquement qui cherche à
entrer).

J'ai l'impression que vous n'avez pas choisi la granularité de vos
données (et donc des verrous) assez finement.

Tel que vous décrivez votre besoin, une base de données permettant de
faire des transactions ou des locks locaux (par ligne par exemple) me
semblerait tout à fait adapatée...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Sébastien Cottalorda
On 18 juin, 11:44, Paul Gaborit wrote:
À (at) Fri, 15 Jun 2007 09:45:07 -0000,
Sébastien Cottalorda écrivait (wrote):



Le noyau, selon mes mesures locke au maximum 1 sec le(s) segment(s)
pour chaque évènement.

Hélas, il n'est pas tout seul pour plusieurs raisons:
* Il y a plusieurs parkings à gérer : les évènements lui ar rive en
parallèle, en effet, sur le nombre de borne entrée/sortie, il se pe ut
tout a fait qu'il y ait plusieurs véhicule souhaita,t entrer ou sortie
simultannément.
* Chque prise de décision doit être atomique : lecture + déci sion
+ écriture ce qui conduit à un lock de ~ 1sec/évènement importa nt
(0,00... sec pour des évènements peu importants),
* Le noyau n'est pas tout seul à écrire dans les segments de
mémoire, même si cela est vrai dans 98% des cas, il faut bien pouvo ir
modifier les données permettant le contrôle d'accès : le nom d'un
client, ses données de facturation, ou tout bêtement modifier les
paramètres des équipements sans avoir à relancer tout le systèm e de
contrôle d'accès (on peux faire mieux que Windows n'est-ce pas ?)

Lorsque le système est très chargé, je fini par avoir un emboutei llage
au niveau des sémaphores, à ce moment là, tous les processus part ent
en timeout.


[...]

Est-ce que j'ai bon ???


Le temps de lock annoncé (1s) me semble énorme. Que fait votre
processus pendant cette longue seconde ? De plus, je ne comprends pas
pourquoi il y aurait (inter)blocage. Quelles sont les données
réellement partagées par tous les processus ? Lorsque je change le nom
d'un client, cela n'a aucun impact sur la contrôle d'accès (sauf dans
le très rare cas où c'est ce client spécifiquement qui cherche à
entrer).

J'ai l'impression que vous n'avez pas choisi la granularité de vos
données (et donc des verrous) assez finement.

Tel que vous décrivez votre besoin, une base de données permettant de
faire des transactions ou des locks locaux (par ligne par exemple) me
semblerait tout à fait adapatée...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Si tu veux vraiment savoir ce qu'il fait ... Il prend une photo du
véhicule ainsi que de sa plaque d'immatriculation.
Puis, il effectue l'OCR sur la plaque et met à jour la "fiche client"
en mémoire avec les références de la prise de vue : horodatage de
prise de vue + immatriculation lue par le système de reconnaissance de
plaque.

Je suis en train de réduire ce temps en dissociant la prise de photo
et le temps réel afin d'augmenter les performances.

Pour se faire, je vais donner au "photographe" (le programme qui
prends les photos), à chaque ordre de prise de photo, une référence
unique afin qu'il mette ensuite à jour, lui même, d'une manière
asynchrone, la fiche client.
Pendant ce temps là le lock aura été libéré par le contrôle d'a ccès,
et la barrière recevra son ordre d'ouverture.

J'escompte une prise de décision aux alentours de 0,4 sec

En ce qui concerne le contenus des segments de mémoire, celui qui me
pose problème est celui contenant la liste des codes d'accès.
En effet, pour qu'un client puisse entrer ou sortir du système, il
faut l'une des 2 choses suivantes (ou bien les 2)
* Que le client possède une immatriculation que le système
connait,
* Que le client saisisse sur l'écran tactile, son code d'accès,
unique, aléatoire, qui lui a été attribué lors de sa réservation de
place.

Que ce soit avec l'une ou l'autre méthode, le contrôle d'accès va:
o locker le segment de mémoire indexé sur les codes d'accès
* si le système est sollicité par le biais d'une lecture
d'immatriculation, le contrôle d'accès va parcourir l'ensemble du
segment afin de rechercher la présence de cette immatriculation. S'il
la trouve -> il va évaluer si le client peut entrer ou pas et donner
l'ordre d'ouverture ou de refus.
* si le système est sollicité par saisie du code confidentiel
(sur un écran tactile), le contrôle d'accès va prendre une photo pour
attester le passage, puis il va vérifier que le code saisie permet
l'entrée ou la sortie. Ensuite il va donner l'ordre d'ouverture d ela
barrière ou bien mentionner un refus sur l'IHM.
o libérer le lock sur le segment de mémoirte contenant les codes

C'est le deuxième cas qui me pose problème actuellement, car il faut
que j'attende ~1 sec que la photo soit prise etc...

En bref le segment qui me pose des problèmes d'accès concurrent est
celui qui est indexé par *code* et qui contient toutes les
informations utiles à la prise de décision du contrôle d'accès.

Je pense que mes segments sont minimalistes.
Cependant, je ne peux pas faire autrement que de locker *l'ensemble*
du segment (donc l'ensemble des fiches client) à chaque fois que le
système prends une décision ?

Je ne peux pas créer un segment par fiche client tout de même ? je
dépasserai la capacité du Système d'Exploitation.


Avatar
espie
In article ,
Sébastien Cottalorda wrote:
On 17 juin, 16:35, (Marc Espie) wrote:
In article ,
Jérémy JUST wrote:
La différence principale était au moment du remplissage des
structures: il suffisait de quelques minutes pour remplir le hash avec
les 3 millions d'enregistrements, à partir d'un fichier tabulé, tandis
qu'il fallait une à deux heures pour Postgresql.


Et encore, c'etait avec du postgresql... sur certains types de tables,
je soupconne que sqlite va nettement plus vite, vu qu'il y a moins de
transferts a faire.


D'une manière ou d'une autre, vous ne m'enlèverez pas de l'idée qu'un
système temps réel basé sur des partages en mémoire est beaucoup plus
performant que tous les systèmes basés sur des fichiers à plats
(indexés ou pas).


Les systemes `temps reels' qui supportent des millions d'enregistrements
ont interet a avoir BEAUCOUP de memoire, ou des choses tres simples a
stocker, et de bonnes garanties quant a la vitesse du swap, sinon ils
auront du mal a etre temps reel...


Mais bon, c'est pour ca qu'on a aussi tous les Fastmmap et autre MemCache,
hein.


Et aussi, penser a virer l'autocommit, et a faire des commits manuels
toutes les 1000 ou 2000 transactions... Ca fait facilement un facteur
dix d'ecart sur la vitesse d'ecriture.


Super, et que se passe t'il si ton système plante au bout de la 999
ème transaction ? ou de la 1999 ième, comment vas-tu expliquer à ton
patron que tu as perdu de l'argent pour une histoire de perfomance ?


Mon patron, il ne va rien penser. Avant de raconter N'IMPORTE QUOI,
il faut lire la TOTALITE du message. On parle ici de remplir une table
de 3 millions d'enregistrements a partir d'un fichier tabule. Que je
sache, si ton systeme plante apres la 999e transaction, ton fichier
tabule est toujours la, et tu vas pouvoir regarder ce qu'il en est...
voire carrement recommencer, si tu etais juste en train d'amorcer une
table a partir d'un fichier.

C'est quand meme un gros classique de l'utilisation des bases de donnees:
on utilise le transactionnel pur en live. Par contre, lorsqu'il s'agit
de convertir des batch de donnees, on peut souvent se permettre d'y
aller par gros lots, toutes precautions prises par ailleurs.

Et, de toutes facons, quelle que soit ta base, tu fais des backups
regulierement, et si c'est vraiment un truc critique ou tu ne peux
pas te permettre de perdre une transaction, tu as un systeme fortement
redondant a tous les niveaux (log papier, double base, etc). Faire les
transactions une par une, meme avec le plus beau systeme informatique
du monde, ne te protegera jamais contre un incendie.



Avatar
Paul Gaborit
À (at) Mon, 18 Jun 2007 10:57:06 -0000,
Sébastien Cottalorda écrivait (wrote):
[...]
Je suis en train de réduire ce temps en dissociant la prise de photo
et le temps réel afin d'augmenter les performances.

Pour se faire, je vais donner au "photographe" (le programme qui
prends les photos), à chaque ordre de prise de photo, une référence
unique afin qu'il mette ensuite à jour, lui même, d'une manière
asynchrone, la fiche client.
Pendant ce temps là le lock aura été libéré par le contrôle d'accès,
et la barrière recevra son ordre d'ouverture.

J'escompte une prise de décision aux alentours de 0,4 sec

En ce qui concerne le contenus des segments de mémoire, celui qui me
pose problème est celui contenant la liste des codes d'accès.
En effet, pour qu'un client puisse entrer ou sortir du système, il
faut l'une des 2 choses suivantes (ou bien les 2)
* Que le client possède une immatriculation que le système
connait,
* Que le client saisisse sur l'écran tactile, son code d'accès,
unique, aléatoire, qui lui a été attribué lors de sa réservation de
place.

Que ce soit avec l'une ou l'autre méthode, le contrôle d'accès va:
o locker le segment de mémoire indexé sur les codes d'accès
* si le système est sollicité par le biais d'une lecture
d'immatriculation, le contrôle d'accès va parcourir l'ensemble du
segment afin de rechercher la présence de cette immatriculation. S'il
la trouve -> il va évaluer si le client peut entrer ou pas et donner
l'ordre d'ouverture ou de refus.
* si le système est sollicité par saisie du code confidentiel
(sur un écran tactile), le contrôle d'accès va prendre une photo pour
attester le passage, puis il va vérifier que le code saisie permet
l'entrée ou la sortie. Ensuite il va donner l'ordre d'ouverture d ela
barrière ou bien mentionner un refus sur l'IHM.
o libérer le lock sur le segment de mémoirte contenant les codes

C'est le deuxième cas qui me pose problème actuellement, car il faut
que j'attende ~1 sec que la photo soit prise etc...

En bref le segment qui me pose des problèmes d'accès concurrent est
celui qui est indexé par *code* et qui contient toutes les
informations utiles à la prise de décision du contrôle d'accès.

Je pense que mes segments sont minimalistes.
Cependant, je ne peux pas faire autrement que de locker *l'ensemble*
du segment (donc l'ensemble des fiches client) à chaque fois que le
système prends une décision ?


Il faut toujours minimiser la durée du passage en section critique
(les instructions entre la mise en place du verrou et sa
libération). Tel qu'exposé, la prise de vue, l'analyse de la photo
pour retrouver le numéro, la saisie du code, etc. ne sont pas en
section critique. Seul la recherche du code ou du numéro devraient
être dans la section critique. Une recherche dans une table de
hachage, c'est bien moins que 1s ! Ensuite, l'ordre d'ouverture se
fait en dehors de la section critique.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Sébastien Cottalorda
On 18 juin, 13:40, (Marc Espie) wrote:
In article ,
Sébastien Cottalorda wrote:

On 17 juin, 16:35, (Marc Espie) wrote:
In article ,
Jérémy JUST wrote:
La différence principale était au moment du remplissage des
structures: il suffisait de quelques minutes pour remplir le hash avec
les 3 millions d'enregistrements, à partir d'un fichier tabulé, t andis
qu'il fallait une à deux heures pour Postgresql.


Et encore, c'etait avec du postgresql... sur certains types de tables,
je soupconne que sqlite va nettement plus vite, vu qu'il y a moins de
transferts a faire.
D'une manière ou d'une autre, vous ne m'enlèverez pas de l'idée qu 'un

système temps réel basé sur des partages en mémoire est beaucoup plus
performant que tous les systèmes basés sur des fichiers à plats
(indexés ou pas).


Les systemes `temps reels' qui supportent des millions d'enregistrements
ont interet a avoir BEAUCOUP de memoire, ou des choses tres simples a
stocker, et de bonnes garanties quant a la vitesse du swap, sinon ils
auront du mal a etre temps reel...


Je suis d'accord si tu stockes en mémoire le transactionnel (dans mon
cas : si je stockais pour chaque client l'ensemble de ses Entrée/
Sorties).
Ce n'est heureusement pas mon cas.
Ma partie temps réel n'est là que pour stocker les *états* en temps
réel.

Chaque "transaction" est passée, d'une manière totalement asynchrone,
à la SGBD qui est, à mon sens, plus lente.

Par ce biais, je limite fortement le besoin en mémoire puisque chaque
fiche client me prend ~800 octets utiles (+ la clef + ce qui est
utilisé par le hachage).



Et aussi, penser a virer l'autocommit, et a faire des commits manuels
toutes les 1000 ou 2000 transactions... Ca fait facilement un facteur
dix d'ecart sur la vitesse d'ecriture.
Super, et que se passe t'il si ton système plante au bout de la 999

ème transaction ? ou de la 1999 ième, comment vas-tu expliquer à t on
patron que tu as perdu de l'argent pour une histoire de perfomance ?


Mon patron, il ne va rien penser. Avant de raconter N'IMPORTE QUOI,
il faut lire la TOTALITE du message. On parle ici de remplir une table
de 3 millions d'enregistrements a partir d'un fichier tabule.


Je ne peux pas me permettre de mettre à jour la SGBD d'une manière
schédulée ou bien par lot.

En fait, dès lors qu'un passage d'un client a lieu, 2 choses sont
effectuées:
* le changement d'état dans la fiche client (temps réel)
* l'enregistrement de la transaction par la SGBD (*avec*
Autocommit).
Ce dernier est effectué d'une manière complètement asynchrone afin de
permettre à la SGBD de prendre son temps si elle est chargée.

Que je sache, si ton systeme plante apres la 999e transaction, ton fichier
tabule est toujours la, et tu vas pouvoir regarder ce qu'il en est...
voire carrement recommencer, si tu etais juste en train d'amorcer une
table a partir d'un fichier.

C'est quand meme un gros classique de l'utilisation des bases de donnees:
on utilise le transactionnel pur en live. Par contre, lorsqu'il s'agit
de convertir des batch de donnees, on peut souvent se permettre d'y
aller par gros lots, toutes precautions prises par ailleurs.


Dans ce cas de figure, je suis d'accord.

Et, de toutes facons, quelle que soit ta base, tu fais des backups
regulierement, et si c'est vraiment un truc critique ou tu ne peux
pas te permettre de perdre une transaction, tu as un systeme fortement
redondant a tous les niveaux (log papier, double base, etc). Faire les
transactions une par une, meme avec le plus beau systeme informatique
du monde, ne te protegera jamais contre un incendie.


Certes, mais les backups, et la redondance ne font pas partie de ma
question initiale, pas plus que le traitement des batches par lot.




Avatar
Sébastien Cottalorda
On 18 juin, 14:03, Paul Gaborit wrote:
À (at) Mon, 18 Jun 2007 10:57:06 -0000,
Sébastien Cottalorda écrivait (wrote):
[...]



Je suis en train de réduire ce temps en dissociant la prise de photo
et le temps réel afin d'augmenter les performances.

Pour se faire, je vais donner au "photographe" (le programme qui
prends les photos), à chaque ordre de prise de photo, une référen ce
unique afin qu'il mette ensuite à jour, lui même, d'une manière
asynchrone, la fiche client.
Pendant ce temps là le lock aura été libéré par le contrôle d'accès,
et la barrière recevra son ordre d'ouverture.

J'escompte une prise de décision aux alentours de 0,4 sec

En ce qui concerne le contenus des segments de mémoire, celui qui me
pose problème est celui contenant la liste des codes d'accès.
En effet, pour qu'un client puisse entrer ou sortir du système, il
faut l'une des 2 choses suivantes (ou bien les 2)
* Que le client possède une immatriculation que le système
connait,
* Que le client saisisse sur l'écran tactile, son code d'accès,
unique, aléatoire, qui lui a été attribué lors de sa réservat ion de
place.

Que ce soit avec l'une ou l'autre méthode, le contrôle d'accès va:
o locker le segment de mémoire indexé sur les codes d'accès
* si le système est sollicité par le biais d'une lecture
d'immatriculation, le contrôle d'accès va parcourir l'ensemble du
segment afin de rechercher la présence de cette immatriculation. S'il
la trouve -> il va évaluer si le client peut entrer ou pas et donner
l'ordre d'ouverture ou de refus.
* si le système est sollicité par saisie du code confidenti el
(sur un écran tactile), le contrôle d'accès va prendre une photo pour
attester le passage, puis il va vérifier que le code saisie permet
l'entrée ou la sortie. Ensuite il va donner l'ordre d'ouverture d ela
barrière ou bien mentionner un refus sur l'IHM.
o libérer le lock sur le segment de mémoirte contenant les codes

C'est le deuxième cas qui me pose problème actuellement, car il faut
que j'attende ~1 sec que la photo soit prise etc...

En bref le segment qui me pose des problèmes d'accès concurrent est
celui qui est indexé par *code* et qui contient toutes les
informations utiles à la prise de décision du contrôle d'accès.

Je pense que mes segments sont minimalistes.
Cependant, je ne peux pas faire autrement que de locker *l'ensemble*
du segment (donc l'ensemble des fiches client) à chaque fois que le
système prends une décision ?


Il faut toujours minimiser la durée du passage en section critique
(les instructions entre la mise en place du verrou et sa
libération). Tel qu'exposé, la prise de vue, l'analyse de la photo
pour retrouver le numéro, la saisie du code, etc. ne sont pas en
section critique. Seul la recherche du code ou du numéro devraient
être dans la section critique. Une recherche dans une table de
hachage, c'est bien moins que 1s ! Ensuite, l'ordre d'ouverture se
fait en dehors de la section critique.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>



Tu as parfaitement Paul,
c'est pourquoi je vais rendre asynchrone la prise de photo.

Ce qu'il faut savoir, c'est que l'analyse de la photo ne doit pas être
en section critique, mais le résultat de l'OCR doit mettre à jour la
fiche cliente, et là, *c'est* en section critique.

Initialement, je pensais que je pouvais me permettre de locker un peu
plus de temps afin de recueillir le résultat de l'OCR puis de mettre à
jour la mémoire.

Il s'avère que cela est trop long.

Par contre, l'ordre d'ouverture se faisait déjà en dehors de la
section critique : je l'ai mentionné, mais je n'aurais pas dû, ce
n'est pas la réalité).



Quoi qu'il en soit cela ne répond toujours pas à ma question sur les
lock.

Je n'ai eu que des réponses concernant la meilleure technologie à
employer en temps réel (passez moi l'expression, mais "je m'en fous").

Le système est déjà construit, je ne vais pas le refaire maintenant
(je n'ai pas le temps)

Je voulais une réponse précise à une quetion précise sur les locks -
c'est tout.


1 2 3