0

我运行一个创建许多 SQLITE3 数据库的服务,然后再次删除它们,它们可能会存活大约一天。它们都具有相同的架构并开始为空。

我用它来创建一个新的空白 SQLITE3 数据库:

sqlite3 newDatabase.db < myschema.sql

myschema.sql 文件包含三个表模式左右,没什么花哨的,没有数据。当我在我相当快的专用 linux 服务器上执行上述命令时,最多需要 5 分钟才能完成。有进程在后台运行,例如几个 PHP 脚本使用 CPU 时间,但其他一切都很快,例如其他命令或稍后将数据插入数据库。这只是需要永远的创造。

这太奇怪了,我完全不知道这里出了什么问题。所以我现在唯一的办法是创建一次空白.db,然后从中制作一个新副本,而不是从 SQL 模式中导入。

知道我搞砸了什么吗?我最初认为 linux 上的 noatime 设置搞砸了它,但不,禁用并没有改变任何东西。

愿意提供您需要的任何配置/数据。

编辑:

This is what strace hangs at:
12:29:45.460852 fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
12:29:45.460965 fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
12:29:45.461079 lseek(4, 512, SEEK_SET) = 512
12:29:45.461550 read(4, "", 8)          = 0
12:29:45.462639 fdatasync(4
4

2 回答 2

1

一种可能性是使用strace命令来查看发生了什么:

strace -f -s 1000 -tt sqlite3 newDatabase.db < myschema.sql

如果它挂在某个地方,你会看到。

你的模式是巨大的吗?

笔记

  • I/O如果怀疑磁盘太高,试试这个命令iotop -oPa,你会看到“谁”把你的系统弄得一团糟
于 2012-11-16T11:13:37.277 回答
0

好吧,我想我明白了这个问题。

服务器在后台运行了几个 PHP 脚本,这些脚本似乎与 CPU 负载有一定的关系,它经常以 100% 的速度飙升,但所有其他命令大部分都运行良好,除了通过 APT-GET 安装东西和安装新的 SQLITE3 数据库。架构。

可能导致问题的原因是繁重的磁盘访问(IO 操作)。我重新安装了 APC,升级到新版本,发现它已被 CLI 禁用(这是默认设置)但由于我有长时间运行的脚本而启用了它,还在这里和那里添加了一些 usleep(100)。

我停止了每一个 PHP 命令,基本上杀死了所有不需要的程序。通过 MYSQL Workbench 检查系统使用率,它似乎仍然很高,直到我意识到这是一个平均值。如果你再等 10 分钟,它会平均下来,在我的情况下接近 0% 负载。完美的。

然后我重新启动了脚本,现在它似乎正在抑制事情。

我尝试了上面提到的 SQLITE3 命令,它按预期立即工作。

所以,简单的原因:不仅是高 CPU 负载,还有 HEAVY IO,磁盘访问。

于 2012-11-16T18:35:58.210 回答