播放不断写入光盘?导致亚马逊ec2上的账单更高

我给自己准备了一个 Amazon ec2 Micro Instance(VPN 服务器)来玩。
问题在于,亚马逊会为您在微实例中执行的每个光盘IO向您收费。
该实例运行的是 Amazon Linux,这是 CentOS 的一种风格。

我已经在服务器上的Play 2.0(.2)框架中启动了一个Scala应用程序,我是唯一一个连接到该应用程序的人。

我观察到服务器上每隔几秒钟就会提交IO事务,为了缩小范围,我安装了一个名为.iotop

下面是几秒钟后的输出。

TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    
23333 be/4 root        0.00 B/s   11.91 K/s  0.00 %  0.00 %  
COMMAND java -Dsbt.ivy.home=/usr/play-2.0.2/framework/../repository -Djava.runtime.name=OpenJDK ~/jars/slf4j-api.jar:/usr/play-2.0.2/repository/local/org.slf4j/jul-to-slf4j/1.6.4/jars/j

日志文件中的猫

cat /home/ec2-user/socketTest/logs/application.log
2012-07-05 11:43:31,881 - [INFO] - from play in main
Listening for HTTP on port 9000...

因此,Play 不会向日志文件写入任何内容。

第一个问题是我是否正确理解了iotop,并且Play确实是光盘IO小偷。
如果是这样,为什么游戏使用IO?

我的应用程序是一个简单的 websocket 示例。从本质上讲,它将输入回显到输出。IO发生,即使你没有任何东西被推过websockets。


答案 1

我终于找到了答案。

通过观察Play何时进行IO事务,我立即执行以下命令:

touch -d '-10 seconds' /tmp/newerthan
find / ! -fstype proc -newer /tmp/newerthan

这返回了一个有趣的行:

/tmp/hsperfdata_root/23320

在谷歌搜索时,我偶然发现了一个错误ID:来自sun JVM的5012932创建子目录“hsperfdata_xxx”。Java这样做是为了实现JRE的非侵入性可观察性,他们声称这是一个功能,而不是一个错误,这就是为什么它没有被解决的原因。
为禁用此“功能”而提出的解决方案是 使用未记录的选项 。我试过这个,但不幸的是,Play一直在进行IO交易。-XX:-UsePerfData

但是经过进一步的挖掘,我发现了另一个开关 。-XX:+PerfDisableSharedMem

所以我在开始播放之前执行了。export _JAVA_OPTIONS="-XX:+PerfDisableSharedMem"

和。。。瞧,Play停止了进行IO交易!


答案 2

如果你想知道哪些文件正在被写入,你可以使用,它在软件包中提供(至少这是Fedora所说的):inotifywaitinotify-tools

$ inotifywait -r -m /opt /etc /var -e ATTRIB -e CREATE -e MODIFY -e DELETE
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/var/tmp/ CREATE etilqs_uOXWfa8v7DkNBgd
/var/tmp/ DELETE etilqs_uOXWfa8v7DkNBgd
/var/tmp/ MODIFY etilqs_uOXWfa8v7DkNBgd
/var/tmp/ MODIFY etilqs_uOXWfa8v7DkNBgd
/var/tmp/ MODIFY etilqs_uOXWfa8v7DkNBgd
  ...

显然,将上面的“/opt /etc /var”替换为您怀疑有趣的任何目录。

几乎可以肯定的是,它比在循环中运行并破坏其输出要有效得多。但是您可能不应该让它在生产中长时间运行。lsof

无论如何,一旦你知道正在写入哪些文件,你就会很好地停止它。:)


推荐