播放不断写入光盘?在 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 run
或play 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