24

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

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

4

4 回答 4

30

我终于找到了答案。

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

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

这返回了一个有趣的行:

/tmp/hsperfdata_root/23320

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

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

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

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

于 2012-07-06T02:11:45.147 回答
3

如果您想知道正在写入哪些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几乎可以肯定,它比在循环中运行并获取其输出要高效得多。但是你可能不应该让它在生产中运行很长时间。

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

于 2012-07-06T00:05:43.517 回答
0

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

于 2012-07-06T00:53:04.010 回答
-2

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

# watch df

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

# du -s /your/path/
于 2012-07-06T01:57:43.683 回答