Я запускаю FreeBSD 9.2p13 с UFS и журналирую обновления программного обеспечения.
Кто-нибудь знает, как настроить журнал softupdates на UFS?
Нет подходящей информации в справочнике, справочных страницах или описании sysctl.
Заранее спасибо за любой совет или место, где я могу узнать больше о настройке журналируемых обновлений программного обеспечения UFS.
Моя проблема:
У меня есть скрипты, парсирующие данные, и я храню их в sophia db.
Когда происходит много мелких записей, иногда файловая система раскалывается, но нагрузка на диск, которую я мог видеть через gstat, systat, vmstat и т. Д., Не указывает на диск или любую другую перегрузку.
в сообщениях вижу только это:
kernel: softdep: Out of journal space!
когда я пытался найти причину, то увидел нормальную ситуацию с дирхашем и vnodes
sysctl -a | grep dirh
vfs.ufs.dirhash_reclaimage: 5
vfs.ufs.dirhash_lowmemcount: 2795
vfs.ufs.dirhash_docheck: 0
vfs.ufs.dirhash_mem: 141044
vfs.ufs.dirhash_maxmem: 27111424
vfs.ufs.dirhash_minsize: 2560
sysctl -a | grep vnodes
kern.maxvnodes: 1223926
kern.minvnodes: 305981
vfs.freevnodes: 305981
vfs.wantfreevnodes: 305981
vfs.numvnodes: 389262
когда я пытался бежать ls к этому терминалу файловой системы заморожены, последние строки из ферма ls показывает, что:
...
lstat("work",{ mode=drwxr-xr-x
,inode=69662209,size=1024,blksize=32768 }) = 0 (0x0)
getdirentries(0x4,0x80100b000,0x1000,0x8010d9068,0xc94a8,0x0) = 0 (0x0)
lseek(4,0x0,SEEK_SET) = 0 (0x0)
возможно, это будет важная информация, но в sysctl нет описания:
debug.softdep.jwait_newblk: 104971
debug.softdep.jwait_inode: 16966
debug.softdep.jwait_freeblks: 0
debug.softdep.jwait_filepage: 736
debug.softdep.journal_wait: 122673
debug.softdep.journal_min: 1
debug.softdep.journal_low: 85056
ОБНОВИТЬ:
Спасибо @Kondibas за ответ о tunefs!
Спасибо Владу за то, что указал мне верный путь :)
Когда я просмотрел источник /sys/ufs/ffs/ffs_softdep.c, я обнаружил, что все остались ответы на мои вопросы.
это указывает мне на ситуацию, когда сообщение появляется в системном журнале:
/*
* Verify some free journal space. softdep_prealloc() should
* guarantee that we don't run out so this is indicative of
* a problem with the flow control. Try to recover
* gracefully in any event.
*/
while (jblocks->jb_free == 0) {
if (flags != MNT_WAIT)
break;
printf("softdep: Out of journal space!\n");
softdep_speedup();
msleep(jblocks, &lk, PRIBIO, "jblocks", hz);
}
Здесь я вижу параметр sysctl для отслеживания ситуации с журналом:
static int stat_journal_low; /* Times hit journal low threshold */
static int stat_journal_wait; /* Times blocked in jwait(). */
эти параметры я вижу в sysctl как:
sysctl debug.softdep.journal_wait
sysctl debug.softdep.journal_low
И здесь я вижу некоторые настраиваемые параметры, на которые влияет поведение sofdep:
softdep_initialize()
{
int i;
LIST_INIT(&mkdirlisthd);
max_softdeps = desiredvnodes * 4;
pagedep_hashtbl = hashinit(desiredvnodes / 5, M_PAGEDEP, &pagedep_hash);
inodedep_hashtbl = hashinit(desiredvnodes, M_INODEDEP, &inodedep_hash);
newblk_hashtbl = hashinit(desiredvnodes / 5, M_NEWBLK, &newblk_hash);
bmsafemap_hashtbl = hashinit(1024, M_BMSAFEMAP, &bmsafemap_hash);
tunefs
есть выбор -S
-S size
Specify the softdep journal size in bytes. The minimum is 4M.
Кажется, что значение по умолчанию для вашей FS слишком мало. Ты должен fsck
ваш раздел, затем отключите ведение журнала с помощью tunefs -j disable /dev/da0p0x
а затем снова включить ведение журнала с большим журналом tunefs -j enable -S 134217728 /dev/da0p0x