सतही स्तर पर केवल एक चीज जिसके बारे में मेरे पास प्रश्न हैं, वह है प्रतीक्षा समूह को बढ़ाने का आदेश देना और कार्य को संलग्न करना:
func (s *Scheduler) Enqueue(req interface{}) {
select {
case s.reqChan <- req:
s.wg.Add(1)
}
}
मुझे नहीं लगता कि उपरोक्त इस बड़े कार्यभार के साथ व्यवहार में बहुत समस्या पैदा करेगा, लेकिन मुझे लगता है कि यह एक तार्किक दौड़ की स्थिति हो सकती है। संगामिति के निचले स्तरों और छोटे कार्य आकारों में, यह एक संदेश को कतारबद्ध कर सकता है, एक गोरोइन पर स्विच कर सकता है जो उस संदेश पर काम शुरू करता है, फिर प्रतीक्षा समूह में काम करता है।
आगे क्या आप सुनिश्चित हैं कि process
विधि थ्रेडसेफ है ?? मुझे लगता है कि रेडिस गो डॉक्यूमेंटेशन के आधार पर, go run -race
. के साथ चल रहा है कोई आउटपुट है?
कुछ बिंदु पर यह पूरी तरह से उचित है और प्रदर्शन के बंद होने की उम्मीद है। मैं यह देखने के लिए प्रदर्शन परीक्षण शुरू करने की अनुशंसा करता हूं कि विलंबता और थ्रूपुट कहां से शुरू होते हैं:
शायद 10, 100, 500, 1000, 2500, 5000, 10000, या जो कुछ भी समझ में आता है उसका पूल। IMO ऐसा लगता है कि ट्यून करने के लिए 3 महत्वपूर्ण चर हैं:
- कार्यकर्ता पूल आकार
- कार्य कतार बफर आकार
- रेडिस
MaxActive
सबसे बड़ी बात यह है कि यह रेडिस जैसा दिखता है। पूल को असीमित संख्या में कनेक्शन की अनुमति देने के लिए कॉन्फ़िगर किया गया है:
pool := &redis.Pool{
MaxIdle: 50,
IdleTimeout: 240 * time.Second,
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
},
Dial: func() (redis.Conn, error) {
return dial("tcp", address, password)
},
}
<ब्लॉकक्वॉट> // एक निश्चित समय में पूल द्वारा आवंटित कनेक्शन की अधिकतम संख्या।// शून्य होने पर, पूल में कनेक्शन की संख्या की कोई सीमा नहीं होती है। MaxActive int
मैं व्यक्तिगत रूप से यह समझने की कोशिश करूंगा कि आपके वर्कर पूल के आकार के संबंध में प्रदर्शन कहां और कब कम होना शुरू होता है। इससे यह समझना आसान हो सकता है कि आपका कार्यक्रम किससे बाधित है।