บันทึกการแก้ปัญหา Sign in นานบน Windows

อาการที่พบ

เวลาในการ Sign in บน Windows นานมากๆ เป็นหลักนาที แม้ว่าจะใช้ SSD M.2 แล้วก็ตาม ใน Event Viewer > Applications มี Warning ที่ Winlogon ว่า “The winlogon notification subscriber is taking long time to handle the notification event (Logon).

อาการนี้เป็นทุกครั้งที่ Sign in ไม่ว่าจะ boot เครื่องมาครั้งแรก หรือแม้แต่ Sign out แล้ว Sign in ใหม่

วิธีแก้ปัญหา

เข้าที่ไปที่ %userprofile%/AppData/Local/Temp แล้วลบทุกอย่างออกให้หมดเท่าที่จะลบได้ จากนั้น Signout แล้วทดลองใหม่

บันทึกวิธีการหาสาเหตุ

เนื่องจากเหตุการนี้เกิดตอน Sign in แล้วระหว่างที่กำลัง Sign in เราแทบไม่มีทางรู้เลยว่ามันไปช้าตรงไหน มีโปรแกรมอะไรทำบ้าง ตอนแรกสงสัยพวก Google Drive, OneDrive, JottaCloud และ Backblaze คิดว่ามันทำงานพร้อมกัน จน IO เต็ม แต่หลังจากลองปิดหมดแล้ว อาการนี้กับไม่หาย

สิ่งแรกที่คิดจะทำคือเราต้องเปิดโปรแกรม Monitor ให้ได้ว่าตอน Sign in เกิดอะไรขึ้น ตอนแรกที่คิดเลยคือ คิดแบบง่ายเข้าอีก User นึงแล้วไปเปิดโปรแกรม Monitor ไว้ แล้วกลับมา Sign in ที่ user ที่มีปัญหา แต่ดันทำไม่ได้ เพราะตอนแรกจะดู real time โดยใช้ Remote Desktop เข้ามาดู Task Manager แต่ตัว RDP Wrapper ที่ทำให้ Sign in ใช้ได้พร้อมกัน 2 users ขึ้นไปดันใช้ไม่ได้ซะงั้น

แต่ที่จากข้างบนดันบังเอิญเจอว่าอีก User มัน Sign in เร็วมาก ตอนนี้เลยตัด OS ออกได้เลย น่าจะเป็นที่ระดับ User เลยพยามยามหาสาเหตุต่อ เช่นหาโปรแกรมมาเช็คว่ามีตัวไหน Start up มาตอน Sign in แล้วน่าสงสัยไหม จนเจอว่าใน Event Viewer > Applications มี Warning ที่ Winlogon มี Event Id เป็น 6005 และ 6006 มีความว่า “The winlogon notification subscriber is taking long time to handle the notification event (Logon).” เมื่อลอง Google ดูมีคนเดาสาเหตุหลายอย่าง ซึ่ง 1 ในนั้นคือบอกว่าควรทำให้ Home User Directory ขนาดเล็กลงนะ แต่จากการพยายามลองทำก็ไม่ช่วยเท่าไหร่ (ย้าย VM กับ Code ออกไปที่อื่น, ลบ Cache npm)

สุดท้ายเลยพยามยามเปิดโปรแกรม Monitor ที่หน้า Sign in นั่นแหละ โดยประยุกจากวีดีโอนี้ ซึ่งหลักการที่เค้าทำคือ การแก้ sethc.exe ซึ่งจะถูกเรียกเมื่อเรากด Shift รัวๆ แล้วมี dialog ขึ้นมา ให้กลายเป็น cmd แทน เนื่องจากเรายังสามารถใช้ windows ได้อยู่ไม่เหมือนในวีดีโอที่เค้ามีปัญหาว่า Sign in ไม่ได้ เลยทำง่ายกว่ามากคือเปิด cmd ด้วยสิทธิ์ Administrator แล้วเข้าไป C:\Windows\System32 แล้วคัดลอก sethc.exe ตัวเดิมไว้ แล้วคัดลอก cmd.exe มาแทนที่ sethc.exe แทนที่ซะ จากนั้นก็ Sign out แล้วไปกด shift รัวๆหน้า sign in เราก็จะได้ cmd มาใช้แล้ว

หลังจากได้ cmd มาใช้ผมก็ใช้ Process Explorer เพื่อพยายามดูว่ามี process ไหนใช้ CPU สูงไหม ปรากฏว่าไม่ขึ้นเลยครับ รอนานมากและไม่มีใครใช้ CPU มากจนน่าสงสัย และไม่มี process ของ user ที่มีปัญหาเลย พอรอจนมี process ของ user นั้นก็ เป็น sign in เข้าได้เลย แสดงว่าช้าก่อน sign in สำเร็จ แต่จุดหน้าสังเกตุของขั้นนี้คือ ผมเห็นมีการใช้ IO ค่อนข้างเยอะมาก แต่ไม่รู้ใครใช้

หลังจากนั้นผมเลยเปลี่ยนโปรแกรม โดยใช้ Process Monitor แทน ซึ่งตัวนี้มีบันทึกการเรียกใช้ File, Registry และอื่นๆ ที่ค่อนข้างละเอียดกว่า แล้วผมก็พบว่ามีการยายามเข้าถึงไฟล์ใน %userprofile%/AppData/Local/Temp/* เยอะมากๆ ซึ่งก็ตรงกับที่ Google ได้มาคือเค้าให้ลดขนาด Home user directory แต่เค้าน่าจะบอกไม่หมดว่าเฉพาะ folder นะ

เพื่อพิสูจน์สมมุติฐาน เนื่องจากไฟล์ที่เข้าถึงอยู่ในโฟลเดอร์ชื่อว่า Temp ดังนั้นจึงน่าจะเป็นไฟล์ที่ไม่สำคัญและลบได้ ซึ่งมีจำนวนทั้งสิ้นมากกว่า 300,000 ไฟล์ (จำไม่ได้ชัดเจน) ผมเลยจัดการลบมันทิ้งทั้งหมดเลย แล้วลอง Sign in ใหม่ และอาการนี้ก็หายไป สามารถ Sign in ได้ใน 3 วินาที

นอกจากนั้นผมยังได้พิสูจน์เพิ่มเติมคือสร้างไฟล์ 200,000 ไปใส่ใน Temp แล้ว Sign out แล้ว Sign in ใหม่ ผลคือใช้เวลาทั้งสิ้น 17 วินาที ซึ่ง และหากเพิ่มเป็น 400,000 ไฟล์ ก็ใช้เวลานานเกิน 30 วินาทีเลยทีเดียว แต่หากย้ายไฟล์ทั้งหมดออกนอก Temp แต่ยังอยู่ใน Local (เช่น %userprofile%/AppData/Local/SomeApp) จะไม่มีผลกับเวลา Sign in (หรืออาจจะมีแต่น้อยกว่า Temp ชนิดที่ผมไม่สังเกตุก็ไม่รู้)

สุดท้ายนี้ งงมากๆว่าตอน Sign in จะไปอ่าน %userprofile%/AppData/Local/Temp ทุกไฟล์ทำเกลืออะไร? มันไม่ควรมีไฟล์สำคัญในนั้นสิ ไม่จำเป็นต้องอ่านทุกครั้งที่ Sign in หรือถ้ามีสำคัญก็ควรจะเป็นแค่ของตัวเองไม่ใช่เหรอ ไม่ใช่ทั้งโฟลเดอร์

อ้อแล้วก็ ไอ้ %userprofile%/AppData/Local/Temp ไม่ถูกลบจาก Disk Cleanup ปกติด้วยนะ ต้องเข้าไปลบเองเท่านั้น เพราะ Disk Cleanup ผมก็ลองแต่แลกแล้วไม่ช่วย (หรือผมอาจจะกดพลาดไปทำให้เผลอไปเอา Temp file ออกก็ไม่น่าใช่อ่ะ)