पृष्ठभूमिइकाई की रूपरेखा और समानता
मैं एक आवेदन है कि समय-समय पर डेटा उदासीनता (एक्सएमएल फाइल) प्राप्त करता है और उन्हें इकाई की रूपरेखा 5 (कोड पहले) का उपयोग कर एक मौजूदा डेटाबेस में आयात करता है। आयात BFK INSERT या BCP कहने के बजाय EF5 के माध्यम से होता है क्योंकि संस्थाओं में पहले से मौजूद व्यवसाय नियम लागू किए जाने चाहिए।
प्रसंस्करण सीपीयू को एप्लिकेशन में ही बाध्य लगता है (अत्यंत तेज़, लिखने-कैश सक्षम डिस्क IO सबसिस्टम पूरे प्रक्रिया में लगभग शून्य डिस्क प्रतीक्षा समय दिखाता है, और SQL सर्वर 8% -10% CPU समय से अधिक नहीं दिखाता है)।
दक्षता में सुधार करने के लिए, मैं एक pipeline using TPL Dataflow घटकों के साथ करने के लिए बनाया:
Read & Parse XML file
|
V
Create entities from XML Node
|
V
Batch entities (BatchBlock, currently n=200)
|
V
Create new DbContext/insert batched entities/ctx.SaveChanges()
मैं ऐसा करके प्रदर्शन में पर्याप्त वृद्धि देखते हैं, लेकिन बारे में 60% से ऊपर सीपीयू नहीं मिल सकता है।
विश्लेषण
संसाधन विवाद किसी प्रकार का संदेह है, मैं VS2012 प्रोफाइलर के संसाधन विवाद डेटा (संगामिति) मोड का उपयोग प्रक्रिया भाग गया।
प्रोफाइलर मुझे लेबल वाले संसाधन के लिए 52% विवाद दिखाता है 2 हैंडल करें। में ड्रिलिंग, मुझे लगता है कि विधि हैंडल के लिए सबसे अधिक विवाद पैदा कर 2,,
System.Data.Entity.Internal.InternalContext.SaveChanges()
दूसरा स्थान है लगभग 40% SaveChanges() के रूप में कई दावे पर
System.Data.Entity.DbSet`1.Add(!0)
सवाल है
- मैं कैसे पता लगा सकते हैं क्या संभाल वास्तव में (ङ है .g। टीपीएल का हिस्सा, ईएफ का हिस्सा)?
- क्या ईएफ थ्रॉटल अलग-अलग थ्रेड से डीबीकॉन्टेक्स्ट इंस्टेंस को अलग करने के लिए कॉल करता है? ऐसा लगता है कि वे एक साझा संसाधन है जिसके लिए वे संघर्ष कर रहे हैं।
- क्या इस मामले में समानता में सुधार करने के लिए मैं कुछ भी कर सकता हूं?
अद्यतन
प्रश्न में चलाने के लिए, काम है कि SaveChanges कॉल 12 के लिए निर्धारित है के लिए समानांतरवाद की अधिकतम डिग्री के लिए (मैं पिछले रन में असीम सहित विभिन्न मूल्यों की कोशिश की)।
अद्यतन 2
माइक्रोसॉफ्ट के एफई टीम प्रतिक्रिया प्रदान की है। सारांश के लिए मेरा उत्तर देखें।
क्या आप वाकई पूल के लिए कनेक्शन पर प्रतीक्षा नहीं कर रहे हैं? क्या आपने अपना कनेक्शन पूल आकार बड़ा करने की कोशिश की है? – Maess
@ मैस: प्रश्न में चलाने के लिए, मैंने अधिकतमांतरता समानांतरता 12 पर सेट की है। यदि मैं सही ढंग से समझता हूं, तो कनेक्शन पूल का डिफ़ॉल्ट अधिकतम आकार 100 है। फिर भी, मैं इसे स्पष्ट रूप से उच्चतम सेट करने का प्रयास करूंगा। –
@Mess: Perfmon कनेक्शन पूल सीमा के नीचे, केवल 11 लॉजिकल कनेक्शन और SQL इंस्टेंस के लिए 11 उपयोगकर्ता कनेक्शन दिखाता है। –