我的台式机配备第三代 Core i5 和 4 GB RAM。我正在使用这台机器来测试构建我贡献的一些自由软件项目。该机器没有其他用途。
我分配了4 GB 交换空间。看起来我的内存仍然不足。
$ make -j 4
...
/opt/developerstudio12.6/bin/CC -DHAVE_CONFIG_H -I. -O2 -template=no%extdef -DCRYPTOPP_DISABLE_SHANI -D__SSE2__=1 -D__SSSE3__=1 -D__SSE4_1__=1 -D__SSE4_2__=1 -D__AES__=1 -DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp/"' -g -c -o cryptest-validat3.o `test -f 'validat3.cpp' || echo './'`validat3.cpp
DBG_GEN FATAL ERROR: dbg_tables.c:171 - fwrite() failed to write required bytes [DBG_GEN 5.7.6]
CC: ube failed for validat3.cpp
错误也会四处移动:
$ make -j 4
...
/opt/developerstudio12.6/bin/CC -DHAVE_CONFIG_H -I. -O2 -template=no%extdef -DCRYPTOPP_DISABLE_SHANI -D__SSE2__=1 -D__SSSE3__=1 -D__SSE4_1__=1 -D__SSE4_2__=1 -D__AES__=1 -DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp/"' -g -c -o cryptest-validat0.o `test -f 'validat0.cpp' || echo './'`validat0.cpp
source='validat1.cpp' object='cryptest-validat1.o' libtool=no \
DEPDIR=.deps depmode=none /bin/sh ./depcomp \
/opt/developerstudio12.6/bin/CC -DHAVE_CONFIG_H -I. -O2 -template=no%extdef -DCRYPTOPP_DISABLE_SHANI -D__SSE2__=1 -D__SSSE3__=1 -D__SSE4_1__=1 -D__SSE4_2__=1 -D__AES__=1 -DCRYPTOPP_DATA_DIR='"/usr/local/share/cryptopp/"' -g -c -o cryptest-validat1.o `test -f 'validat1.cpp' || echo './'`validat1.cpp
...
libsunir aborting on error
Assertion failed: IR_FALSE, file ../src/IrLib.c, line 204, function ir_err_report
...
CC: Fatal error in /opt/developerstudio12.6/lib/compilers/bin/ube
CC: Status 134
make[1]: *** [Makefile:1477: cryptest-validat1.o] Error 134
我没有运行任何其他程序。只能通过makefile编译。
当我检查时dmesg
我看到WARNING: /tmp: File system full, swap space limit exceeded
。根据 Oracle 文档警告:/tmp:文件系统已满,超出交换空间限制:
原因
系统交换区(虚拟内存)已满。您需要通过终止某些进程或可能通过重新启动系统来减少交换空间消耗。
行动
有关增加交换空间的信息,请参阅“没有足够的空位”。
我很困惑 4 GB 或 RAM 和 4 GB 交换空间不足以运行编译器。我不知道需要分配多少内存来运行编译器。
我应该分配多少虚拟内存才能使编译器运行而不会崩溃?
$ zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 21.3G 207G 4.85M /rpool
rpool/ROOT 13.6G 207G 31K legacy
rpool/ROOT/solaris 13.6G 207G 12.9G /
rpool/ROOT/solaris/var 526M 207G 367M /var
rpool/VARSHARE 164K 207G 69.5K /var/share
rpool/VARSHARE/pkg 63K 207G 32K /var/share/pkg
rpool/VARSHARE/pkg/repositories 31K 207G 31K /var/share/pkg/repositories
rpool/VARSHARE/zones 31K 207G 31K /system/zones
rpool/dump 1.96G 207G 1.90G -
rpool/export 1.62G 207G 33.5K /export
rpool/export/home 1.62G 207G 33K /export/home
rpool/export/home/apolyakov 38K 207G 38K /export/home/apolyakov
rpool/export/home/jwalton 1.62G 207G 1.62G /export/home/jwalton
rpool/swap 4.13G 207G 4.00G -
即使出现内存或存储故障,它也会报告健康:
$ zpool status -x
all pools are healthy
还有一些会计:
$ zpool status -v
pool: rpool
state: ONLINE
scan: none requested
config:
NAME STATE READ WRITE CKSUM
rpool ONLINE 0 0 0
c1t0d0 ONLINE 0 0 0
errors: No known data errors
这台机器的名字是solaris3
。这是第三台遇到这些麻烦的机器。第一个是 Sun HCL 上的二手 DL380 G5 服务器。第二个是来自 Sun 的 Intel Utlra-24。第三个是低端Core i5。
在硬件上放置操作系统时,我没有做任何特别的事情。我从 Sun 下载了 Solaris x86 ISO(现在两次)。我运行安装程序并采用默认值。当出现提示时,我选择“使用整个磁盘”选项。
安装操作系统后,我启用 Solaris Studio 发布者。然后,我安装 Autoconf、Automake、Libtool、Git、Subversion、GDB、Sun Studio 12.2 到 12.6 以及其他一些开发工具。安装额外软件后,所有三台计算机上都有数百 GB 的可用空间。
所有机器都是无头的。安装操作系统后,我删除了显示器。虽然机器在我的地下室,但我通过 SSH 远程工作。
我不是 Solaris 管理员,我不会随意更改设置。我更改设置以应对此类问题。更改交换大小等设置后,我使用 重新启动计算机reboot -p
。
答案1
Developer Studio 12.6 的系统要求索拉里斯10指定至少 8GB 交换空间。对于solaris 11.3,同一个文档说要查看操作系统文档。操作系统文档说“请咨询您的应用程序供应商,了解其应用程序的交换空间要求。”
这有点循环,因为软件供应商(Oracle)说要检查操作系统文档(也是 Oracle),而操作系统文档又说要检查软件供应商文档。无穷无尽。
最后,我会根据 Solaris 10 的要求将交换空间增加到 8GB,因为 Solaris 11 中没有什么比“您的供应商怎么说?”更明确的了。
答案2
在 Solaris 中,文件系统 /tmp 由 tmpfs 提供。 tmpfs 将文件系统保存在虚拟内存中。认为它与 ramdisk 非常相似。你在 /tmp 中写入的所有内容都会从 VM 子系统分配内存,并且由于 Solaris 是一个急切的分配器,即使内容在内存中,交换也会为此保留,因为你希望能够在内存稀疏的情况下交换这些内容(非常简单) 。
AFAIR 的原因之一是使编译器能够通过将本地内存上的临时文件而不是远程磁盘发送来进行快速编译。默认情况下,Sun Studio 编译器将临时文件写入 /tmp 。您应该尝试将 TMPDIR 设置为 /var/tmp ,它驻留在磁盘上,但性能会降低。也许您只是在 /tmp 中写了很多内容。作为替代方案,您可以只增加交换。
答案3
你的问题可能在其他地方。
在线搜索错误消息的“DBG_GEN FATAL ERROR”部分表明,这似乎非常适合您的任务。也许检查有问题的代码并查看它尝试写入的位置?它可能是临时文件系统或其他容量有限的设备。
例如,/tmp(在 Linux 上通常作为 tmpfs 安装)上的空间不足是某些类型的任务中出现“空间不足”错误的常见原因。