Date: Wed, 8 May 2019 23:52:58 +0000 From: Rick Macklem <rmacklem@uoguelph.ca> To: Peter Eriksson <pen@lysator.liu.se> Cc: "freebsd-fs@freebsd.org" <freebsd-fs@FreeBSD.org> Subject: Re: test hash functions for fsid Message-ID: <YQBPR0101MB2260AA6B2642A5DDE49D4A35DD320@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM> In-Reply-To: <D27D3F7A-22B3-4EDA-AD61-1B95366D1A2D@lysator.liu.se> References: <YQBPR0101MB2260D82BAE348FB82902508CDD320@YQBPR0101MB2260.CANPRD01.PROD.OUTLOOK.COM>, <D27D3F7A-22B3-4EDA-AD61-1B95366D1A2D@lysator.liu.se>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Peter wrote:
>Here’s the output from a couple of our servers (filur00 with around 24289 zfs >filesystems, balur01 with about 72350 zfs filesystems, filur04 about 7500 zfs >filesystems):
>
>
>Lpeter86@filur00:~ % ./testhash
>H1: max=24290 min=0
>H2: max=24290 min=0
>H3: max=24290 min=0
>H4: max=24290 min=0
>
>Lpeter86@balur01:~ % /tmp/testhash
>H1: max=73343 min=0
>H2: max=73343 min=0
>H3: max=73343 min=0
>H4: max=73343 min=0
>
>Lpeter86@filur04:~ % /tmp/testhash
>H1: max=7560 min=0
>H2: max=7560 min=0
>H3: max=7560 min=0
>H4: max=7560 min=0
>
I'll admit when I first looked at this, I was baffled;-)
Turns out the f_fsid field is just zeros when getmntinfo() is run by non-root.
Please do this again as "root". I have attached a slightly modified version
with an additional trivial hash and it calculates variance.
Thanks for doing this, rick
[-- Attachment #2 --]
#include <stdio.h>
#include <err.h>
#include <sys/param.h>
#include <sys/fnv_hash.h>
#include <sys/hash.h>
#include <sys/mount.h>
int
main(int argc, char *argv[])
{
int h1[256], h2[256], h3[256], h4[256], h5[256], i, max, min, num;
struct statfs *mntbufp;
float ave, vari, totvari;
for (i = 0; i < 256; i++) {
h1[i] = 0;
h2[i] = 0;
h3[i] = 0;
h4[i] = 0;
h5[i] = 0;
}
num = getmntinfo(&mntbufp, MNT_NOWAIT);
if (num == 0)
errx(1, "Must be run as root");
for (i = 0; i < num; i++) {
h1[fnv_32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), 0) % 256]++;
h2[fnv_32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), FNV1_32_INIT) % 256]++;
h3[hash32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), 0) % 256]++;
h4[hash32_buf(&mntbufp[i].f_fsid, sizeof(fsid_t), HASHINIT) % 256]++;
h5[mntbufp[i].f_fsid.val[0] % 256]++;
}
ave = (float)num / 256.0;
min = 10000000;
max = 0;
totvari = 0.0;
for (i = 0; i < 256; i++) {
if (h1[i] > max)
max = h1[i];
if (h1[i] < min)
min = h1[i];
if ((float)h1[i] > ave)
vari = (float)h1[i] - ave;
else
vari = ave - (float)h1[i];
totvari += vari;
}
printf("H1: max=%d min=%d totvari=%f\n", max, min, totvari);
min = 10000000;
max = 0;
totvari = 0.0;
for (i = 0; i < 256; i++) {
if (h2[i] > max)
max = h2[i];
if (h2[i] < min)
min = h2[i];
if ((float)h2[i] > ave)
vari = (float)h2[i] - ave;
else
vari = ave - (float)h2[i];
totvari += vari;
}
printf("H2: max=%d min=%d totvari=%f\n", max, min, totvari);
min = 10000000;
max = 0;
totvari = 0.0;
for (i = 0; i < 256; i++) {
if (h3[i] > max)
max = h3[i];
if (h3[i] < min)
min = h3[i];
if ((float)h3[i] > ave)
vari = (float)h3[i] - ave;
else
vari = ave - (float)h3[i];
totvari += vari;
}
printf("H3: max=%d min=%d totvari=%f\n", max, min, totvari);
min = 10000000;
max = 0;
totvari = 0.0;
for (i = 0; i < 256; i++) {
if (h4[i] > max)
max = h4[i];
if (h4[i] < min)
min = h4[i];
if ((float)h4[i] > ave)
vari = (float)h4[i] - ave;
else
vari = ave - (float)h4[i];
totvari += vari;
}
printf("H4: max=%d min=%d totvari=%f\n", max, min, totvari);
min = 10000000;
max = 0;
totvari = 0.0;
for (i = 0; i < 256; i++) {
if (h5[i] > max)
max = h5[i];
if (h5[i] < min)
min = h5[i];
if ((float)h5[i] > ave)
vari = (float)h5[i] - ave;
else
vari = ave - (float)h5[i];
totvari += vari;
}
printf("H5: max=%d min=%d totvari=%f\n", max, min, totvari);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?YQBPR0101MB2260AA6B2642A5DDE49D4A35DD320>
