我正在尝试使用 EC2“micro”AMI(他们推荐的 micro 32 位 AMI,ami-7f418316,其内核为 2.6.35.14-95.38.amzn1.i686)来运行 grails 应用程序(来自 github grails-core 的 grails 2.0.0 BUILD-SNAPSHOT,因此这是 M2 之后的版本)。它有时会正常工作,但有时在 grails 启动时(在我运行应用程序之前)它会进入 100% java 或 java + rsyslogd 锁定状态,转储一堆 /var/log/message,看起来像是内存映射出了问题:
[180297.535565] ------------[ cut here ]------------
[180297.535572] WARNING: at arch/x86/xen/multicalls.c:182 xen_mc_flush+0x224/0x250()
[180297.535580] Modules linked in: ipv6 binfmt_misc dm_mirror dm_region_hash dm_log
dm_mod rtc_core rtc_lib ext4 mbcache jbd2 crc16 uhci_hcd ohci_hcd ssb ehci_hcd usbcore
nls_base [last unloaded: scsi_wait_scan]
[180297.535638] Pid: 24986, comm: java Tainted: G D W 2.6.35.11-83.9.amzn1.i686 #1
[180297.535646] Call Trace:
[180297.535653] [<c104282d>] warn_slowpath_common+0x6d/0xa0
[180297.535661] [<c1004a44>] ? xen_mc_flush+0x224/0x250
[180297.535669] [<c1004a44>] ? xen_mc_flush+0x224/0x250
[180297.535678] [<c104287d>] warn_slowpath_null+0x1d/0x20
[180297.535686] [<c1004a44>] xen_mc_flush+0x224/0x250
[180297.535694] [<c10063ae>] ? xen_extend_mmu_update+0xce/0x190
[180297.535703] [<c100650d>] xen_set_pud_hyper+0x9d/0xc0
[180297.535711] [<c10065a4>] xen_set_pud+0x74/0xc0
[180297.535719] [<c102cf90>] pud_populate+0x40/0x80
[180297.535726] [<c10b1b73>] __pmd_alloc+0x73/0x80
[180297.535735] [<c12aefd0>] ? do_page_fault+0x0/0x400
[180297.535743] [<c10b63e2>] handle_mm_fault+0xd22/0xdc0
[180297.535751] [<c1004922>] ? xen_mc_flush+0x102/0x250
[180297.535759] [<c1005b06>] ? arbitrary_virt_to_machine+0x86/0xc0
[180297.535768] [<c12aefd0>] ? do_page_fault+0x0/0x400
[180297.535776] [<c12af0fc>] do_page_fault+0x12c/0x400
[180297.535784] [<c1036df1>] ? finish_task_switch+0x41/0x90
[180297.535793] [<c1048015>] ? irq_exit+0x35/0x70
[180297.535801] [<c12aefd0>] ? do_page_fault+0x0/0x400
[180297.535809] [<c12ac637>] error_code+0x73/0x78
[180297.535817] [<c12a0000>] ? quirk_usb_early_handoff+0xd6/0x579
[180297.535824] ---[ end trace a7919e7f17c0c5a0 ]---
我尝试过 openjdk 和 sun jdk,症状相同(间歇性)。你知道这是否意味着 Grails 2 无法在 Amazon EC2 上运行,或者可能值得在更大的实例上尝试吗?或者我现在应该将 Grails 应用程序转移到 CloudFoundry 吗?
答案1
我尝试了 32 位和 64 位的 Amazon Linux AMI 微版本:结果相同(不稳定)。64 位版本被杀死得更快(我思考这是因为该 AMI 上没有交换设备)。因此,我从微型版本切换到小型 32 位版本,并且运行良好。我没有尝试任何非默认的 Grails 内存调整,目前这样做就够了。