播放不断写入光盘?在 Amazon ec2 上导致更高的账单

Posted

技术标签:

【中文标题】播放不断写入光盘?在 Amazon ec2 上导致更高的账单【英文标题】:Play constantly writes to disc? Causing higher bill on Amazon ec2 【发布时间】:2012-07-06 05:44:48 【问题描述】:

我有一个 Amazon ec2 微型实例(一个 *** 服务器)可以玩。 问题是亚马逊会为您在微型实例中执行的每个磁盘 IO 收取费用。 该实例运行的是 CentOS 风格的 Amazon Linux。

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

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

这是几秒钟后的输出。

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 示例。本质上,它将输入回显到输出。即使您没有通过 websocket 推送任何内容,也会发生 IO。

【问题讨论】:

您正在启动您的 Play!服务器使用 sbt(即play runplay start)还是使用play dist 生成的启动脚本? 【参考方案1】:

我终于找到了答案。

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

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

这返回了一个有趣的行:

/tmp/hsperfdata_root/23320

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

但经过更多挖掘后,我发现了另一个开关-XX:+PerfDisableSharedMem

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

而且... Voilà Play 停止了 IO 交易!

【讨论】:

【参考方案2】:

如果您想知道正在写入哪些 文件,您可以使用inotifywait,它包含在inotify-tools 包中(至少Fedora 是这么称呼它的):

$ 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 并获取其输出要高效得多。但是您可能不应该让它在生产环境中运行很长时间。

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

【讨论】:

【参考方案3】:

您还可以递归地ls 您的目录并按atime(或mtime 或其他)排序

【讨论】:

【参考方案4】:

另一个解决方案(简单但有用):

# watch df

然后你可以运行它来更深入:

# du -s /your/path/

【讨论】:

以上是关于播放不断写入光盘?在 Amazon ec2 上导致更高的账单的主要内容,如果未能解决你的问题,请参考以下文章

AWS Amazon Linux EC2 实例:apache 用户权限被拒绝写入目录

放入光盘 windows不能从此盘读取,总是显示"准备好写入光盘的文件"

为EC2 Amazon Linux实例设置SFTP Sublime Text 3

在 Amazon EMR 4.1 和 Amazon EC2 上安装 Impala

如何在 Amazon EC2 主机上设置 Django 网站?

自动关闭和启动 Amazon EC2 实例