किसी दिए गए मैक एप्लिकेशन का उपयोग करने के लिए कितना स्वैप है?


15

क्या यह बताने का कोई तरीका है कि मैक OSX (10.2+) पर चलने वाले किसी विशेष एप्लिकेशन को इसकी कुछ मेमोरी स्वैप की गई है (यानी, किसी एक /private/var/vm/swapfile*फाइल में)? और कितना?

बाउंटी (150 आरपीएस)

सरल प्रश्न। पहला सही उत्तर स्वीकार किया जाएगा यदि मैं इसे बाउंटी अवधि की समाप्ति के 2 दिनों से कम समय के साथ देखता हूं। अगर मुझे अभी भी एक नहीं मिला है, तो मैं इसे सबसे दिलचस्प नया तथ्य बताता हूं। और अगर मैंने किसी भी जवाब से एक भी चीज नहीं सीखी, तो मैं सबसे ज्यादा लिखता हूं, जो भी सबसे ज्यादा लिखता है, मैं उसे इनाम दूंगा।


यह इतना बुरा सवाल है। जिस संख्या की आप तलाश कर रहे हैं वह बदल जाएगी क्योंकि आप इसे मापने की कोशिश कर रहे थे (सोचें कि हाइजेनबर्ग अनिश्चितता सिद्धांत)। इसके अलावा यह अन्य अनुप्रयोगों और उनकी स्मृति आवश्यकताओं, io पैटर्न और प्रक्रिया प्राथमिकता के आधार पर हर समय बदल जाएगा। यदि आपको पता चलता है कि यह आपको कोई अच्छा काम नहीं करने वाला है, जब तक कि आप ओएस कोड का संपादन नहीं करते हैं, क्योंकि ऐसा बहुत कम है कि आप इसे बदलने के लिए एप्लिकेशन के दृष्टिकोण से करने जा रहे हैं।
गावल्ट्ज़

3
@gavaletz: आज सुबह बिस्तर के गलत साइड से बाहर निकलो? मैं उस तरह की स्वैप प्रोफाइलिंग करना चाहता हूं जो लिनक्स / खरीद / $ pid / smaps का उपयोग करके संभव बनाता है। मैं आम तौर पर अपने कानों का उपयोग करके स्वैप गतिविधि के अचानक फटने की पहचान कर सकता हूं, इसलिए मैं गवलेत्ज़ के अनिश्चितता सिद्धांत से बहुत परेशान नहीं हूं।
चार्ल्स स्टीवर्ट

जवाबों:


13

मैं बहुत कुछ कर रहा हूँ;; जैसा कि मैं इसे समझता हूँ, किसी दी गई प्रक्रिया की आभासी मेमोरी को उन पृष्ठों में विभाजित किया जाता है जो OS द्वारा संभाले जाते हैं और अनुप्रयोग को प्रस्तुत किए जाते हैं जैसे कि यह RAM था।

OS X में, माच कर्नेल के आधार पर, इसे एक डेमन द्वारा संभाला जाता है dynamic_pager। यह प्रक्रिया स्वैफाइल (ओं) को उत्पन्न करती है /private/var/vmजैसा कि आप उल्लेख करते हैं। ये स्वैपफाइल प्रति आवेदन के आधार पर उत्पन्न नहीं होते हैं, लेकिन "स्मृति की आवश्यकता" के आधार पर होते हैं। स्वैपफाइल्स को 4096 बाइट्स के पन्नों में विभाजित किया गया है, और फिर पृष्ठों को उन प्रक्रियाओं को आवंटित किया जाता है जिन्हें (ओएस द्वारा समझा जाता है) को वर्चुअल मेमोरी की आवश्यकता होती है। इसलिए, आप किसी दिए गए आवेदन के साथ एक स्वैपफिल को जोड़ नहीं सकते हैं, लेकिन आप देख सकते हैं कि दी गई प्रक्रिया कितने पृष्ठों का उपयोग कर रही है।

आप vm_statटर्मिअल में कमांड को आज़माना चाह सकते हैं। यह आपको वीएम उपयोग का एक आँकड़ा देता है (ध्यान दें कि सक्रिय पेजों की संख्या 'पृष्ठ आकार' आपके स्वैपफाइल (एस) के आकार के बराबर होती है)। यह यह भी बताता है कि आप वीएम का उपयोग करते हुए कई प्रक्रियाएं क्यों कर सकते हैं, लेकिन केवल एक जोड़े को स्वैपफाइल्स।

अन्य मज़ा आदेशों हैं vmmap [process id]और pagestuff


वैसे, अगर आप कुछ और जानना चाहते हैं, तो डेवलपर .apple.com/mac/library/documentation/Darwin/Conceptual/… को देखें।
trolle3000

यह आशाजनक लग रहा है। यह प्रश्न के पहले भाग के लिए एक निश्चित उत्तर प्रदान करता है, और दूसरे भाग के लिए एक ठोस उत्तर का सूचक है। मुझे आगे खुदाई करने की आवश्यकता है ...
चार्ल्स स्टीवर्ट

आपके प्रश्न के दूसरे भाग के लिए उत्तर vmmap [pid]या vmmap -pages [pid]उत्तर नहीं है ?
trolle3000

vmmap $ pid यह लिखने योग्य क्षेत्रों के रूप में वर्गीकृत करने के बारे में अस्पष्ट जानकारी देता है। यह आवंटित (यानी। स्वैपेबल) के बीच अंतर नहीं करता है और पढ़ने वाले क्षेत्रों के लिए स्मृति को स्वैप करता है, लेकिन शायद वहाँ अंतर इतना महत्वपूर्ण नहीं है। मैं इस उत्तर को कल स्वीकार करने की बहुत संभावना है।
चार्ल्स स्टीवर्ट

5

vmmap PIDआदेश दिए गए प्रक्रिया के बारे में संख्या में आप कुछ उपयोगी आँकड़े देना चाहिए।


यहां तक कि vmmap [AppName] काम करता है
Studer

4

यहाँ पोस्ट किए गए विचारों के आधार पर मैंने इस कोड की एक छोटी लाइन बनाई:

sudo vmmap notifyd | grep -A3 'Summary'

जो vmmap आउटपुट का सारांश खंड (3 लाइन) प्रदर्शित करता है। मैंने notifydइस उदाहरण में उपयोग किया है, लेकिन आप इसे किसी भी पीआईडी ​​के साथ बदल सकते हैं जिसे आप जानते हैं।

यह रेखा सभी चल रही प्रक्रियाओं की सभी सारांश लाइनों को सूचीबद्ध करने का प्रयास करेगी। स्पष्ट रूप से कुछ विफल हो जाएंगे क्योंकि उनकी प्रक्रिया आईडी पहले से ही चली गई है (प्रक्रिया समाप्त हो गई है), लेकिन सामान्य तौर पर मैंने पाया कि यह स्मृति जानकारी की सूची के माध्यम से स्क्रॉल करने और शीर्ष स्वैपर को स्पॉट करने का एक शानदार तरीका है।

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'

संपादित: कुछ अनाम उपयोगकर्ता ने देखा कि इस अंतिम कमांड लाइन में सुधार की आवश्यकता है क्योंकि जाहिर है कि मूल संस्करण अब काम नहीं करता था। इसलिए आपका बहुत-बहुत धन्यवाद जो आप हैं और मुझे खेद है कि आपका संपादन अस्वीकार कर दिया गया। (पहले कमांड ने पहले 'ps xa' को पढ़ा और इसके परिणामस्वरूप vmmap विफल हो गया क्योंकि ps के शीर्षक को इस पर फेंक दिया गया था)

और सुधार: यदि आप कार्यक्रम का नाम जानना चाहते हैं तो अभी इस छोटे से परिवर्तन का उपयोग करें

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | egrep 'swapped_out|Path'

इस कमांड के दूसरे छोर पर थोड़ा सा संशोधन आपको कुछ प्रोग्राम नामों या कमांड लाइन पथ घटकों के लिए फ़िल्टर करने में सक्षम बनाता है। यहां हम 'लाइब्रेरी / PrivateFrameworks' से सभी प्रक्रियाओं को केवल उदाहरण के लिए देख रहे हैं।

ps -o pid,command= -xa | grep 'Library/PrivateFrameworks' | awk '{print $1}' | xargs -n 1 sudo vmmap |

मुझे बहुत सी असफलताएँ मिलीं, जो कहती हैं कि vmmap को 32-लेकिन प्रक्रिया के रूप में लॉन्च नहीं किया जा सकता है, जो xargs को रोकती है। जारी रखने के लिए कार्ड प्राप्त करने के लिए, मैंने किया ps -o pid= -xa | awk '{print $1}' | xargs -n 1 -I{} bash -c ‘sudo vmmap {} || true’ | egrep 'swapped_out|^Path:|^Process:'। यह अभी भी ctrl + c पर नहीं रुकता है, लेकिन यह vmmap त्रुटियों पर भी नहीं रुकता है।
शाद्टरलिंग

0

अपने / एप्लिकेशन / उपयोगिताएँ फ़ोल्डर में गतिविधि मॉनिटर खोलें और एक वर्चुअल मेमोरी कॉलम है जो आपको यह बताएगा। आप वर्चुअल मेमोरी हेडर पर क्लिक कर सकते हैं जो एप्लिकेशन द्वारा उपयोग किए जाने वाले अधिकांश या कम से कम सॉर्ट करने के लिए है। मेरी प्रक्रियाओं को सभी प्रक्रियाओं में बदलना सुनिश्चित करें, और ध्यान रखें कि एक आवेदन में कई प्रक्रियाएं हो सकती हैं। उदाहरण के लिए 3rd पार्टी एप्लीकेशन लिटिल स्निच में "लिटिल स्निक नेटवर्क मॉनिटर" और "लिटिल स्नेक यूआईजेंट" शामिल हैं।


4
यह गलत है। वर्चुअल मेमोरी कॉलम में न्युबर वर्तमान में रैम और स्वैप, एमएमएपीड फाइलों में मेमोरी का एक योग है और मुझे नहीं पता कि और क्या है।
तदेउस्ज़ ए। कदलोबोस्की

क्या आपको यकीन है? Apple इसका समर्थन
।apple.com

1
VM नंबर आवंटित राशि को मापता है लेकिन वास्तव में अभी तक उपयोग नहीं किया गया है। स्वैप फ़ाइलों में वही होगा जो वास्तव में उपयोग किया जाता है।
चीलियन

@ चुनाव: आप कैसे परिभाषित करते हैं कि स्मृति आवंटित की गई है लेकिन वास्तव में उपयोग नहीं की जाती है?
तदेउस्ज़ ए। कदलोबोस्की

@tkadlubo: इस मामले में, मेरा विश्वास है कि यह केवल एक प्रक्रिया के लिए उपलब्ध VM आकार के बीच की विसंगति है, जो वास्तविक पृष्ठों बनाम डिस्क के लिए पृष्ठांकित है। मुझे यकीन नहीं है कि यह कैसे ध्यान दें कि वीएम नंबर और डिस्क पर स्वैप फाइलें अलग-अलग हैं, इसे कैसे परिभाषित किया जाए।
चीलियन

0

जैसा कि उपहास ने कहा, गतिविधि मॉनिटर खोलें। उस प्रक्रिया पर नेविगेट करें जिसका आप निरीक्षण करना चाहते हैं, और क्लिक करें ... निरीक्षण करें! फिर मेमोरी पर क्लिक करें; यह आपको बताएगा कि दी गई प्रक्रिया का उपयोग कितना स्वैप है।

मज़े करो!


3
निरीक्षण पृष्ठ मुझे उन सभी प्रकार की रोचक बातें बताता है, जो सकारात्मक रूप से सहसंबद्ध हैं कि प्रश्न का उत्तर क्या है, जैसे #pagefaults, #pageins, और mmapped फ़ाइलों की सूची, लेकिन कहीं भी प्रश्न के वास्तविक उत्तर के बाद मैं नहीं हूँ।
चार्ल्स स्टीवर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.