2012-07-05 20 views
24

पर उच्च बिल के कारण मुझे अपने साथ खेलने के लिए एक अमेज़ॅन ec2 माइक्रो इंस्टेंस (एक वीपीएन सर्वर) मिला है।
समस्या यह है कि अमेज़ॅन आपको माइक्रो इंस्टेंस में किए गए प्रत्येक डिस्क IO के लिए चार्ज करता है।
उदाहरण अमेज़ॅन लिनक्स को सेंटोस का स्वाद चल रहा है।लगातार डिस्क पर लिखते हैं? अमेज़ॅन ec2

मैंने सर्वर पर Play 2.0 (.2) ढांचे में एक स्कैला एप्लिकेशन शुरू कर दिया है और मैं केवल एकमात्र हूं जो एप्लिकेशन से जुड़ता है।

मैंने देखा है कि सर्वर पर हर कुछ दूसरी चीज आईओ लेनदेन करता है, इसे कम करने के लिए मैंने 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... 

तो खेलते हैं लॉग फ़ाइल के लिए कुछ भी लिखना नहीं है लॉग फ़ाइल से एक बिल्ली।

पहला सवाल मैंने आईपोटो को सही समझा है और वास्तव में डिस्क आईओ चोर है।
यदि ऐसा है तो आईओ का उपयोग क्यों करें?

मेरा आवेदन एक साधारण वेबसाईट उदाहरण है। संक्षेप में यह आउटपुट में इनपुट echos। IO तब भी होता है जब आप websockets के माध्यम से कुछ भी नहीं धक्का दिया जाता है।

+0

क्या आप अपना प्ले लॉन्च कर रहे हैं! एसबीटी (यानी 'प्ले रन' या 'प्ले स्टार्ट') का उपयोग कर सर्वर या आप 'play dist' द्वारा उत्पन्न स्टार्ट स्क्रिप्ट का उपयोग कर रहे हैं? –

+0

मैं 'play start' – Farmor

उत्तर

3

आप को पता है जो फ़ाइलों के लिए लिखा जा रहा है चाहते हैं, तो आप inotifywait, जो inotify-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 चलाने और इसके आउटपुट को grepping करने से लगभग निश्चित रूप से अधिक कुशल है। लेकिन आपको शायद इसे उत्पादन में लंबे समय तक नहीं चलना चाहिए।

वैसे भी, एक बार जब आप जानते हैं कि कौन सी फाइलें लिखी जा रही हैं, तो आप इसे रोकने के रास्ते पर अच्छे होंगे। :)

+0

बहुत बढ़िया टूल का उपयोग कर रहा हूं! धन्यवाद! –

0

तुम भी रिकर्सिवली ls अपने निर्देशिका और प्रकार atime (या mtime या जो कुछ भी)

-2

फिर भी एक और समाधान (सरल लेकिन उपयोगी) द्वारा कर सकते हैं:

# watch df 

तो फिर तुम चला सकते हैं यह जाने के लिए गहरा:

# du -s /your/path/ 
30

मुझे अंततः उत्तर मिला है।

/tmp/hsperfdata_root/23320 

हालांकि इस पर googling मैं एक बग आईडी पर ठोकर खाई: 5012932

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

यह एक दिलचस्प लाइन लौटे:

को देख जब प्ले एक आईओ लेनदेन किया मैं तुरन्त इस आदेश निष्पादित सूर्य से JVM creates subdirectory "hsperfdata_xxx"। जावा जेआरई के noninvasive अवलोकनता सक्षम करने के लिए करता है, वे दावा करते हैं कि यह एक सुविधा है, न कि एक बग है, यही कारण है कि इसे हल नहीं किया गया है।
इस "फीचर" को अक्षम करने के लिए प्रस्तुत एक समाधान एक अनियंत्रित विकल्प -XX:-UsePerfData का उपयोग करना था। मैंने कोशिश की लेकिन दुर्भाग्य से आईओ लेनदेन करना जारी रखा।

लेकिन कुछ और खुदाई के बाद मुझे एक और स्विच -XX:+PerfDisableSharedMem मिला।

इसलिए मैंने प्ले शुरू करने से पहले export _JAVA_OPTIONS="-XX:+PerfDisableSharedMem" निष्पादित किया।

और ... Voilà Play ने आईओ लेनदेन करना बंद कर दिया!

संबंधित मुद्दे