UFS wedge:“日志空间不足!”-如何调整?(FreeBSD)

UFS wedge:“日志空间不足!”-如何调整?(FreeBSD)

我正在运行带有 UFS 和日志软更新的 FreeBSD 9.2p13。

有人知道如何调整 UFS 上的软更新日志吗?

手册、手册页或 sysctl 描述中没有合适的信息。

在此先感谢大家提出的任何建议或意见,让我可以阅读更多有关 UFS 日志软更新调整的信息。

我的问题:

我有一些脚本,解析数据,并将其存储在 sophia db 中。

当发生大量小写入时,有时文件系统会出现楔入,但磁盘负载(我可以通过 gstat、systat、vmstat 等看到)并不表示磁盘或任何其他过载。

在消息中我只能看到以下内容:

kernel: softdep: Out of journal space!

当我尝试寻找原因时,我看到 dirhash 和 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到文件系统终端冻结,最后的字符串来自桁架表明:

...
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 的回答!

感谢 Vlad 为我指明了正确的方向 :)

当我查看源代码 /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);

答案1

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

相关内容