OVH Cloud OVH Cloud

Place prise par un fichier core sur disque

11 réponses
Avatar
Vincent Lefevre
Est-il possible qu'un fichier core de 1 GB ne prenne quasiment pas de
place sur disque?

ay:~> df -T .; ls -l core; rm -f core; ls core; df -T .
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/hda5 ext3 5621496 4182900 1153032 79% /home
-rw------- 1 lefevre lefevre 1180438528 2003-07-09 09:26 core
ls: core: No such file or directory
zsh: exit 1 ls core
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/hda5 ext3 5621496 4174472 1161460 79% /home

i.e. moins de 10 Mo étaient réellement pris sur le disque.

--
Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> - 100%
validated (X)HTML - Acorn Risc PC, Yellow Pig 17, Championnat International
des Jeux Mathématiques et Logiques, TETRHEX, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

10 réponses

1 2
Avatar
Stephane CHAZELAS
Le Wed, 9 Jul 2003 07:29:44 +0000 (UTC), Vincent Lefevre <vincent+ écrivait :
Est-il possible qu'un fichier core de 1 GB ne prenne quasiment pas de
place sur disque?


Oui, s'il est à trous. Ça peut peut-etre arriver si deux applis
dumpent le meme core en meme temps.

Exemple pour créer un "sparse file":

~$ echo | dd bs=1M seek00 of=core
0+1 enregistrements lus.
0+1 enregistrements écrits.
~$ ll core
-rw-r--r-- 1 chazelas users 1048576001 2003-07-09 09:55 core
~$ du core
4 core

--
Stéphane

Avatar
Vincent Lefevre
Dans l'article ,
Stephane CHAZELAS écrit:

Le Wed, 9 Jul 2003 07:29:44 +0000 (UTC), Vincent Lefevre <vincent+ écrivait :
Est-il possible qu'un fichier core de 1 GB ne prenne quasiment pas de
place sur disque?


Oui, s'il est à trous.


Ah, je ne savais pas que ça existait en pratique.

Ça peut peut-etre arriver si deux applis dumpent le meme core en
meme temps.


Il n'y avait qu'une seule appli, mais je suppose qu'il doit y avoir
un gros trou entre les données et la pile.

Merci,

--
Vincent Lefèvre - Web: <http://www.vinc17.org/> - 100%
validated (X)HTML - Acorn Risc PC, Yellow Pig 17, Championnat International
des Jeux Mathématiques et Logiques, TETRHEX, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


Avatar
Olivier Aumage
Salut Vincent,

Vincent Lefevre <vincent+ writes:

Dans l'article ,
Stephane CHAZELAS écrit:

Le Wed, 9 Jul 2003 07:29:44 +0000 (UTC), Vincent Lefevre <vincent+ écrivait :
Est-il possible qu'un fichier core de 1 GB ne prenne quasiment pas de
place sur disque?


Oui, s'il est à trous.


Ah, je ne savais pas que ça existait en pratique.


Il n'y a d'ailleur pas besoin de deux applications pour faire un
fichier à trous. Le trou est crée quand on fait un 'seek' au-dela de
la fin du fichier suivi d'une écriture. Le seek ne génère pas de
contenu effectif (chaque octet est supposé égal à 0).

Exemple rapide en Perl:

$perl -e 'open FD, "> a";
seek FD, 1024*1024*1024, SEEK_SET;
print FD "x";
close FD;'

La place occupée par 'a' est de 12 octets sur mon système (Linux), la
taille indiqué par ls est de 1 go + 1 octet.


Dans le cas du core, les trous correspondent vraisemblablement aux
pages mémoire allouées par le processus mais non utilisées.

--
Olivier



Avatar
Stephane CHAZELAS
Le Wed, 09 Jul 2003 18:35:09 +0200, Olivier Aumage écrivait :
[...]
Il n'y a d'ailleur pas besoin de deux applications pour faire un
fichier à trous. Le trou est crée quand on fait un 'seek' au-dela de
la fin du fichier suivi d'une écriture. Le seek ne génère pas de
contenu effectif (chaque octet est supposé égal à 0).

Exemple rapide en Perl:
[...]


Oui, ou simplement l'exemple avec "dd seek=" que je donnais.

[...]
Dans le cas du core, les trous correspondent vraisemblablement aux
pages mémoire allouées par le processus mais non utilisées.


Probable en effet. Ce que je pensais avec mes deux applis qui
corent en meme temps, c'est.

une qui fait le.

open("core", O_CREAT|O_TRUNC|O_WRONLY)
qui écrit 120 Mo
à ce moment-là c'est l'autre qui core:
open("core", O_CREAT|O_TRUNC|O_WRONLY)
les 120 premiers Mo écrits par la première appli sont perdus, et
il aura un trou entre la fin du core de l'appli2 (qu'on
supposera plus petit que 120Mo) et l'offset 120Mo.

Maintenant, il est possible que le systeme fasse un
unlink("core") avant de dumper un core ou qu'il refuse d'écraser
un core et que le cas que je décris ne puisse pas se produire.
En tout cas, j'ai pu le produire sous Linux.

--
Stéphane

Avatar
Jean-Yves LENHOF
On Wed, 09 Jul 2003 07:29:44 +0000, Vincent Lefevre wrote:

Est-il possible qu'un fichier core de 1 GB ne prenne quasiment pas de
place sur disque?



Une autre piste éventuellement ulimit -c est-il à autre chose qu'a 0 ?

JYL

Avatar
Olivier Aumage
Stephane CHAZELAS writes:

Le Wed, 09 Jul 2003 18:35:09 +0200, Olivier Aumage écrivait :

Exemple rapide en Perl:


Oui, ou simplement l'exemple avec "dd seek=" que je donnais.


En effet, j'avais lu un peu vite... :-)

Dans le cas du core, les trous correspondent vraisemblablement aux
pages mémoire allouées par le processus mais non utilisées.


Probable en effet. Ce que je pensais avec mes deux applis qui
corent en meme temps, c'est.

[snip]

Maintenant, il est possible que le systeme fasse un
unlink("core") avant de dumper un core ou qu'il refuse d'écraser
un core et que le cas que je décris ne puisse pas se produire.
En tout cas, j'ai pu le produire sous Linux.


C'est un peu étonnant, mais puisque tu affirmes l'avoir produit, je ne
conteste pas :-).

Cela dit, j'ai jeté un coup d'oeil au code de mon kernel hier soir
(2.4.18, je crois) et la création du fichier core est dans une section
critique, donc a priori, il n'est apparamment pas possible d'avoir
deux applications qui génère un core en même temps avec cette version
de noyau, sauf avec un système de fichier distribué.

%----[fs/exec.c]--------------------------------------
int do_coredump(long signr, struct pt_regs * regs)
{
struct linux_binfmt * binfmt;
[...]
int retval = 0;

lock_kernel();
binfmt = current->binfmt;
[...]
retval = binfmt->core_dump(signr, regs, file);

unlock_kernel();
return retval;
}
%-----------------------------------------------------

Pour les 'seek' lors de la génération du fichier core, voir notamment
le fichier fs/binfmt_elf.c. Par exemple :

%----[fs/binfmt_elf.c]--------------------------------
if (page == ZERO_PAGE(addr)) {
DUMP_SEEK (file->f_pos + PAGE_SIZE);
} else {
void *kaddr;
flush_cache_page(vma, addr);
kaddr = kmap(page);
DUMP_WRITE(kaddr, PAGE_SIZE);
flush_page_to_ram(page);
kunmap(page);
}
%-----------------------------------------------------

--
Olivier


Avatar
Stephane CHAZELAS
Le Thu, 10 Jul 2003 09:14:54 +0000 (UTC), shaddai écrivait :
[...about sparse file...]
Avec les logiciels de p2p on a aussi ce phénomène, ls -l renvoie la
taille finale du fichier, mais du lui arrive à donner la taille correcte
à l'instant t, donc il doit avoir une autre façon de vérifier, si
quelqu'un (stephane au hasard :) sait pourquoi, je suis preneur pour mon
éducation.


Ils créent un fichier à trou de la taille finale (initialement
juste un grand trou tout vide). Et ensuite écrivent dedans en
parallèle à plusieurs endroits (suivant les connexions aux
multiples peers), en l'ouvrant concurrentiellement sans O_TRUNC
et en faisant les lseek qui vont bien.

Seul ton logiciel de p2p sait quand tous les trous ont été
comblés.

--
Stéphane

Avatar
Manu
shaddai wrote:

Avec les logiciels de p2p on a aussi ce phénomène, ls -l renvoie la
taille finale du fichier, mais du lui arrive à donner la taille correcte
à l'instant t, donc il doit avoir une autre façon de vérifier, si
quelqu'un (stephane au hasard :) sait pourquoi, je suis preneur pour mon
éducation.


Je suppose que du regarde la taille du fichier en nombre de blocs.
Or dans un "fichier à trous", dans les infos de l'inoeud où on trouve la
taille du fichier en octet et le nombre de bloc:
taille fichier != nombre de blocs * taille d'un bloc

-=( manu )=-

Avatar
Laurent Wacrenier
Vincent Lefevre <vincent+ écrit:
Il n'y avait qu'une seule appli, mais je suppose qu'il doit y avoir
un gros trou entre les données et la pile.


4 Go est l'espace adressable sur 32 bits.
Les trous correspondent à de l'espace non alloué.

Avatar
kanze
jsp
Olivier Aumage wrote in message
news:...

Vincent Lefevre <vincent+ writes:

Dans l'article ,
Stephane CHAZELAS écrit:
Le Wed, 9 Jul 2003 07:29:44 +0000 (UTC), Vincent Lefevre
<vincent+ écrivait :

Est-il possible qu'un fichier core de 1 GB ne prenne quasiment
pas de place sur disque?


Oui, s'il est à trous.


Ah, je ne savais pas que ça existait en pratique.


Il n'y a d'ailleur pas besoin de deux applications pour faire un
fichier à trous. Le trou est crée quand on fait un 'seek' au-dela de
la fin du fichier suivi d'une écriture. Le seek ne génère pas de
contenu effectif (chaque octet est supposé égal à 0).

Exemple rapide en Perl:

$perl -e 'open FD, "> a";
seek FD, 1024*1024*1024, SEEK_SET;
print FD "x";
close FD;'

La place occupée par 'a' est de 12 octets sur mon système (Linux), la
taille indiqué par ls est de 1 go + 1 octet.


Ça m'étonnerait que la place occupée soit seulement 12 octets.

En fait, un fichier a une taille logique, et une taille physique. La
taille logique, c'est ce que tu trouves dans le champs st_size d'un
struct stat ; c'est aussi ce qu'affiche ls. Elle correspond au nombre
d'octets que tu pourrais lire. Tu n'as normalement pas de moyen de voir
la taille physique, au moins, pas de façon portable. Mais grosso modo,
c'est la place que le fichier occupe physiquement sur disque. Et c'est
toujours une multiple de la taille d'un bloc d'allocation (qui lui est
toujours une multiple de 512).

Ni l'une ni l'autre ne prend en compte les octets occupés par le inode
ou par le nom du fichier dans le répertoire.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16




1 2