2014-05-19 7 views
5

लिनक्स कर्नेल> = 3.9 में गिरी लोड संतुलन के साथ प्रक्रियाओं के बीच सॉकेट के साझा करने की अनुमति SO_REUSEPORT की स्थापना द्वारा: http://lwn.net/Articles/542629/यूनिक्स डोमेन सॉकेट पर SO_REUSEPORT का उपयोग किया जा सकता है?

कैसे इस प्रकार AF_UNIX के कोटर के लिए इस्तेमाल किया जा सकता है?

ऐसा लगता है, यह केवल टीसीपी के साथ काम करता है, यूनिक्स डोमेन सॉकेट नहीं।

import os 
import socket 

if not hasattr(socket, 'SO_REUSEPORT'): 
    socket.SO_REUSEPORT = 15 

if True: 
    # using TCP sockets 
    # works. test with: "echo data | nc localhost 8888" 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 
    s.bind(('', 8888)) 
else: 
    # using Unix domain sockets 
    # does NOT work. test with: "echo data | nc -U /tmp/socket1" 
    s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 
    try: 
     os.unlink("/tmp/socket1") 
    except: 
     pass 
    s.bind("/tmp/socket1") 

s.listen(1) 
while True: 
    conn, addr = s.accept() 
    print('Connected to {}'.format(os.getpid())) 
    data = conn.recv(1024) 
    conn.send(data) 
    conn.close() 

प्रारंभ 2 उदाहरणों, और निम्न कई बार चलाकर परीक्षण:

यहाँ एक अजगर परीक्षण कार्यक्रम है टीसीपी यूनिक्स डोमेन सॉकेट के लिए

  • echo data | nc -U /tmp/socket1 के लिए

    • echo data | nc localhost 8888

    टीसीपी का उपयोग करते समय, आने वाली ग्राहक दोनों सर्वरों के लिए संतुलित हो जाएगा। यूनिक्स डोमेन सॉकेट के साथ, आने वाले क्लाइंट सभी अंतिम प्रारंभ सर्वर से कनेक्ट हो जाते हैं।

  • +0

    आपके द्वारा संदर्भित आलेख की पहली वाक्य: '3.9 विकास चक्र में विलय की गई सुविधाओं में से एक SO_REUSEPORT सॉकेट विकल्प के लिए टीसीपी और यूडीपी समर्थन था। ऐसा लगता है कि केवल टीसीपी और यूडीपी के लिए समर्थित है। –

    +0

    मेरे पास सटीक उत्तर नहीं है लेकिन ऐसा लगता है कि कर्नेल में यूनिक्स सॉकेट को संतुलित करने का कोई मतलब नहीं है। इसमें बहुत उपयोगी जानकारी है: http://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t –

    +0

    @AlexShkop धन्यवाद! एफडब्ल्यूआईडब्ल्यू, मैं यूडीएस पर विकल्प सेट कर सकता हूं, और यह एकाधिक प्रक्रियाओं को एक ही यूडीएस (सुनना) खोलने की अनुमति देगा। जब विकल्प सेट नहीं होता है, तो ऐसा करने की अनुमति नहीं होती है। हालांकि, यह लोड-बैलेंस नहीं है। मैं एक आधिकारिक उत्तर की तलाश में हूं जो या तो मनाए गए व्यवहार का समर्थन करता है या दिखाता है कि एलबी-संतुलित साझा यूडीएस कैसे करें। – oberstet

    उत्तर

    4

    इस विशिष्ट कर्नेल पैच यहाँ प्रलेखित है:

    http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c617f398edd4db2b8567a28e899a88f8f574798d

    आप समझौता फ़ाइलों की सूची से देख सकते हैं, पैच केवल net/ipv4 और net/ipv6 सॉकेट को प्रभावित किया। यूनिक्स डोमेन सॉकेट net/unix में कार्यान्वित किए गए हैं। तो, जवाब है: नहीं, SO_REUSEPORT AF_UNIX प्रकार के सॉकेट के साथ काम नहीं करेगा।

    +0

    ठीक है। धन्यवाद! यह एक आधिकारिक उत्तर है - हालांकि यह नकारात्मक है = ( – oberstet

    +0

    निराश करने के लिए खेद है। लेकिन शायद आप नियमित सॉकेट पर स्विच कर सकते हैं? –

    +0

    उत्तर अभी भी अद्यतित है।फिर भी मैं आधिकारिक अद्यतन की सराहना करता हूं :) –

    1

    एक छोटा पैच, जो यूनिक्स सॉकेट was posted पर SO_REUSEPORT के लिए समर्थन जोड़ता है, लेकिन इसे अस्वीकार कर दिया गया है। हालांकि इस पैच ने एकाधिक सॉकेट पर लोड-बैलेंसिंग को लागू नहीं किया है, इसलिए सॉकेट फ़ाइल पहले से मौजूद होने पर ही bind() विफल नहीं हुई है।

    यह उपयोग के मामले में उपयोगकर्ता के नजरिए

    से

    एक बहुत अजीब कोने मामले समझा था तो वहाँ अब भी है संभावना, एक अलग पैच कि, कि यूनिक्स के लिए लोड संतुलन लागू करेगा SO_REUSEPORT के माध्यम से सॉकेट स्वीकार किए जाएंगे।

    संबंधित मुद्दे