नहीं, इसका मतलब यह नहीं है कि डेटा खो गया था। इसका सीधा सा मतलब है कि आईआरओ (आईओ रिक्वेस्ट पैकेट) का समय समाप्त हो गया जबकि आईओ सिस्टम ने इसके पूरा होने का इंतजार किया और इसलिए इसे फिर से आजमाया गया। जब कोई थ्रेड किसी IO ऑपरेशन को शुरू करता है, तो IO प्रबंधक ऑपरेशन को दर्शाने के लिए IRP बनाता है क्योंकि यह सिस्टम से गुजरता है।
आईआरपी अपने प्रारंभिक अवस्था में बफर / लुक-साइड सूची में संग्रहीत हो जाता है, ताकि पहली बार विफल होने पर इसे वापस लिया जा सके। यह वह अमान्यता प्रदान करता है, जिसकी किसी भी व्यवहारिक प्रणाली से उम्मीद होगी ताकि हम और अधिक आत्मविश्वास से परिपूर्ण हो सकें कि आप अपनी डिस्क पर लिखे गए दूषित या अपूर्ण डेटा का एक गुच्छा नहीं लेंगे।
यह घटना MPIO विफलता की स्थिति में सही समझ में आता है। मान लें कि Windows SAN स्टोरेज से कुछ पढ़ने या लिखने के लिए जाता है। अनुरोध भेजा गया है, और उसी पल में, मैंने केबल में से एक को काट दिया SAN को। वह अनुरोध कभी पूरा नहीं होने वाला है, और इसलिए Windows अनुरोध को फिर से कोशिश करेगा, केवल इस बार अनुरोध दूसरे पथ का अनुसरण करेगा।
ये घटनाएँ तब भी होती हैं जब डिस्क ओवरबर्ड हो जाती हैं या बस वास्तव में धीमी होती हैं। आप इन संदेशों को निर्धारित बैकअप के साथ मेल खाते हुए देख सकते हैं, आदि डिस्क बस धीमी और व्यस्त हो सकती है, और कुछ यादृच्छिक आईआरपी समय पर बाहर हो गए हैं और फिर से कोशिश करनी है। आईआरपी एक बाधा सेवा दिनचर्या, या एक आस्थगित प्रक्रिया कॉल, या जो भी हो, में फंस सकता है।
मैं आपके ढेर में बहुत सारे IO फ़िल्टर ड्राइवरों को देख सकता था और साथ ही साथ इस मुद्दे को बढ़ा भी सकता था।
ऐसा नहीं है कि यह व्यवहार विंडोज के पिछले संस्करणों में ऐसा नहीं हुआ था, यह सिर्फ इतना है कि Microsoft ने स्पष्ट रूप से इन घटनाओं को Win8 या सर्वर 2012 में सतह पर लाने का फैसला किया था।
संपादित करें: आप कर्नेल डिबगर के साथ एक थ्रेड के बकाया आईआरपी पा सकते हैं: kd> !irp 1a2b3c4d
जहां आपने पहले उस आदेश को जारी करके उस पते को पाया था kd> !process 8f7d6c4a
जो उस प्रक्रिया से जुड़े थ्रेड से जुड़े सभी आईआरपी को सूचीबद्ध करेगा। kd> !process 0 0
सभी प्रक्रियाओं को सूचीबद्ध करने के लिए।
एक बार जब आप आईआरपी कमांड का उपयोग करके आईआरपी के बारे में जानकारी सूचीबद्ध करते हैं, तो आप आसानी से यह देख सकते हैं कि किस चालक ने आईआरपी को अंतिम रूप से संभाला है क्योंकि यह >
सूची में इसे इंगित करेगा । फिर उस IRP के साथ वह ड्राइवर क्या कर रहा था, इसके बारे में अधिक जानकारी प्राप्त करने के लिए, kd> !devobj 1a2b3c4d5e6f
वह डिवाइस ऑब्जेक्ट का वास्तविक पता कहां है।
फिर kd> dt 0x1a2b3c3c2b1a _CLASS_PRIVATE_FDO_DATA
आपके द्वारा प्राप्त PrivateFdoData संरचना के पते का उपयोग करें।
अब आप AllTransferPacketsList डेटा संरचना को PrivateFdoData से प्राप्त करने के लिए तैयार हैं।
विचार यह है कि आप नीचे ट्रैक कर रहे हैं कि ड्राइवर क्या कर रहा था, आईआरपी के साथ पिछली बार जब यह देखा गया था। यदि IRP बहुत लंबे समय के लिए AWOL है, तो यह समय से समाप्त हो गया है और शुरुआत से ही पीछे हट गया है। यह बहुत सी चीजों के कारण हो सकता है ... यहां तक कि एक आवारा लौकिक किरण भी। लेकिन महत्वपूर्ण बात यह है कि लेन-देन शुरू से ही वापस ले लिया जाएगा, और इसे तब तक पूरा नहीं माना जाएगा जब तक कि आईओ प्रबंधक यह न कहे।
ओह, और थ्रेड-अज्ञेयवादी IO भी है जो कि कीड़े की एक पूरी तरह से अलग किस्म है। :)
इस विषय पर आगे पढ़ने के लिए, मैं मार्क रोसिनोविच, मार्गोसिस, एट अल से विंडोज इंटर्नल 6 वें संस्करण के अध्याय 8, I / O सिस्टम की अत्यधिक अनुशंसा करता हूं।
** संपादित करें: ** मुझे आखिरकार इस त्रुटि के लिए आधिकारिक KB मिला: http://support.microsoft.com/kb/2819485/EN-US
आईओ ऑपरेशन को प्रति मिनट 8 बार, जब तक कि विंडोज नहीं देता, तब तक पीछे हट जाना चाहिए।
संपादित करें: जैसा कि वादा किया गया है: http://blogs.msdn.com/b/ntdebugging/archive/2013/04/30/interpreting-event-153-errors.aspx