ไม่ไม่ได้หมายความว่าข้อมูลสูญหาย มันหมายความว่าหมดเวลาของ IRP (IO Request Packet) ในขณะที่ระบบ IO รอให้มันเสร็จสมบูรณ์และลองอีกครั้ง เมื่อเธรดเริ่มต้นการดำเนินการ IO ตัวจัดการ IO จะสร้าง IRP เพื่อแสดงการดำเนินการที่ผ่านเข้ามาในระบบ
IRP ได้รับการจัดเก็บในสถานะเริ่มต้นในรายการบัฟเฟอร์ / ดูด้านข้างเพื่อให้สามารถลองใหม่ได้หากล้มเหลวในครั้งแรก นั่นทำให้อะตอมมีความคาดหวังจากระบบการทำธุรกรรมใด ๆ เพื่อให้เรามั่นใจมากขึ้นว่าคุณจะไม่ได้รับข้อมูลที่เสียหายหรือไม่สมบูรณ์เขียนลงดิสก์ของคุณ
เหตุการณ์นี้เหมาะสมอย่างยิ่งในกรณีที่ MPIO เกิดความล้มเหลว สมมติว่า Windows ไปอ่านหรือเขียนข้อมูลจากที่เก็บข้อมูล SAN คำขอถูกส่งและในเวลาเดียวกันฉันก็ตัดสายเคเบิลหนึ่งสายไปยัง SAN คำขอนั้นจะไม่เสร็จสมบูรณ์และดังนั้น Windows จะลองคำขออีกครั้งคราวนี้คำขอจะเป็นไปตามเส้นทางอื่น
เหตุการณ์เหล่านี้เกิดขึ้นเมื่อดิสก์มีภาระมากเกินไปหรือช้ามาก คุณอาจสังเกตเห็นข้อความเหล่านี้ตรงกับการสำรองข้อมูลตามกำหนดเวลา ฯลฯ ดิสก์อาจช้าและไม่ว่างและ IRP แบบสุ่มหมดเวลาและต้องลองอีกครั้ง IRP อาจติดค้างอยู่ในรูทีนการบริการขัดจังหวะหรือการเรียกโพรซีเดอร์ที่เลื่อนออกไปหรืออะไรก็ตาม
ฉันเห็นว่ามีไดรเวอร์ตัวกรอง IO จำนวนมากในสแต็กของคุณที่ทำให้ปัญหานี้รุนแรงขึ้นเช่นกัน
ไม่ใช่ว่าพฤติกรรมนี้ไม่ได้เกิดขึ้นเช่นนี้ใน Windows รุ่นก่อนหน้า แต่เป็นเพียงว่า Microsoft ตัดสินใจที่จะแสดงเหตุการณ์เหล่านี้ใน Win8 / Server 2012
แก้ไข:คุณสามารถค้นหา IRP ที่ค้างอยู่ของเธรดด้วยเคอร์เนลดีบักเกอร์: kd> !irp 1a2b3c4d
ซึ่งก่อนหน้านี้คุณพบที่อยู่นั้นโดยการออกคำสั่งkd> !process 8f7d6c4a
ซึ่งจะแสดงรายการ IRP ทั้งหมดที่เกี่ยวข้องกับเธรดที่เชื่อมโยงกับกระบวนการนั้น kd> !process 0 0
เพื่อแสดงรายการกระบวนการทั้งหมดที่กำลังทำงาน
เมื่อคุณแสดงรายการข้อมูลเกี่ยวกับ IRP โดยใช้คำสั่ง! irp คุณสามารถเห็นได้อย่างง่ายดายว่าไดรเวอร์ตัวใดที่จัดการกับ IRP ล่าสุดเพราะมันจะมีตัว>
ชี้ไปที่รายการ จากนั้นเมื่อต้องการรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่โปรแกรมควบคุมนั้นทำกับ IRP นั้นให้ทำkd> !devobj 1a2b3c4d5e6f
ที่ซึ่งเป็นที่อยู่จริงของวัตถุอุปกรณ์
จากนั้นทำการkd> dt 0x1a2b3c3c2b1a _CLASS_PRIVATE_FDO_DATA
ใช้ที่อยู่ของโครงสร้าง PrivateFdoData ที่คุณได้รับ
ตอนนี้คุณพร้อมที่จะถ่ายโอนโครงสร้างข้อมูล AllTransferPacketsList ที่คุณได้รับจาก PrivateFdoData
แนวคิดก็คือคุณกำลังติดตามสิ่งที่คนขับทำกับ IRP ในครั้งล่าสุดที่เห็น หาก IRP เป็น AWOL นานเกินไปก็จะหมดเวลาและลองใหม่ตั้งแต่ต้น สิ่งนี้อาจเกิดจากหลายสิ่ง ... แม้แต่รังสีคอสมิคจรจัด แต่สิ่งสำคัญคือการทำธุรกรรมจะถูกลองใหม่ตั้งแต่ต้นและจะไม่ถูกพิจารณาว่าเสร็จสมบูรณ์จนกว่าผู้จัดการ IO จะกล่าวว่าเป็น
Oh, และยังมีด้ายไม่เชื่อเรื่องพระเจ้า IO ซึ่งเป็นสมบูรณ์สามารถที่แตกต่างกันของเวิร์ม :)
สำหรับการอ่านเพิ่มเติมในหัวข้อนี้ฉันขอแนะนำบทที่ 8 ระบบ I / O ของ Windows Internals 6th edition จาก Mark Russinovich, Margosis และอื่น ๆ
** แก้ไข: ** ในที่สุดฉันก็พบ KB อย่างเป็นทางการสำหรับข้อผิดพลาดนี้: http://support.microsoft.com/kb/2819485/EN-US
การดำเนินการ IO ควรลองใหม่ 8 ครั้งครั้งต่อนาทีจนกว่า Windows จะหมด
แก้ไข: ตามที่สัญญาไว้: http://blogs.msdn.com/b/ntdebugging/archive/2013/04/30/interpreting-event-153-errors.aspx