মাইএসকিউএল অপেক্ষাকৃত কম সংখ্যার অপেক্ষার সময়কাল মানকে হ্রাস করছে


39

আমি বরং ব্যস্ত সাইট চালাচ্ছি এবং উঁকি দেওয়ার সময় আমি আমার ওয়েবসারভারে আমার ডাটাবেস সার্ভারের সাথে 10.000 এর ওপেন সংযোগগুলি দেখি যখন একটি নেট নেটট কমান্ড চালায়। 99% সংযোগ TIME_WAITরাজ্যে রয়েছে।

আমি এই মাইএসকিএল ভেরিয়েবলটি সম্পর্কে শিখেছি: wait_timeout http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_Toutout today। আমার এখনও ডিফল্ট 28.800 সেকেন্ডে সেট করা আছে।

এই মান কম করা কি নিরাপদ?

আমার জিজ্ঞাসা না করে সাধারণত এক সেকেন্ড সময় নেয়। সুতরাং 480 মিনিটের জন্য কোনও সংযোগ খোলা রাখা নির্বোধ বলে মনে হচ্ছে।

আমি এর mysql_pconnectপরিবর্তে ব্যবহার সম্পর্কে শুনেছি mysql_connect, তবে আমি এটি সম্পর্কে হরর গল্প ছাড়া কিছুই পড়ছি না, তাই আমি মনে করি আমি এ থেকে দূরে থাকব।


3
প্রশ্ন এবং সংযোগের মধ্যে পার্থক্য রয়েছে। কমপক্ষে আপনাকে নিশ্চিত করতে হবে wait_timeoutযে সফ্টওয়্যারটি উন্মুক্ত থাকার প্রত্যাশা করলে কোনও সংক্ষিপ্ত সংযোগ বন্ধ হওয়ার কারণে যদি আপনার ওয়েবসাইটটি সফ্টওয়্যারটি ভেঙে না যায় ।
জন গার্ডেনিয়ার্স

উত্তর:


74

মাইএসকিএল পুনরায় চালু না করে মান হ্রাস করা বেশ তুচ্ছ

ধরা যাক আপনি 30 সেকেন্ডের সময়সীমা কমিয়ে দিতে চান

প্রথমে এটি my.cnf এ যুক্ত করুন

[mysqld]
interactive_timeout=30
wait_timeout=30

তারপরে, আপনি এই জাতীয় কিছু করতে পারেন

mysql -uroot -ppassword -e"SET GLOBAL wait_timeout=30; SET GLOBAL interactive_timeout=30"

এর পরে সমস্ত ডিবি সংযোগ 30 সেকেন্ডের মধ্যে শেষ হবে

সতর্কতামূলক

স্পষ্টভাবে mysql_close ব্যবহার নিশ্চিত করুন। বেশিরভাগ বিকাশকারীদের মতো আমি আপাচে বিশ্বাস করি না। যদি তা না হয়, কখনও কখনও, এমন একটি দৌড়ের শর্ত রয়েছে যেখানে আপাচি একটি ডিবি সংযোগ বন্ধ করে দেয় তবে মাইএসকিএলডি এবং মাইএসকিএলডকে অবহিত করে না যে সংযোগটি সময় শেষ না হওয়া পর্যন্ত খোলা রাখে। আরও খারাপ, আপনি আরও বেশি বার TIME_WAIT দেখতে পাবেন। আপনার সময়সীমার মানগুলি বুদ্ধিমানের সাথে চয়ন করুন।

আপডেট 2012-11-12 10:10 ইডিটি

বিচারকার্য স্থগিত রাখার আদেশ

আমার পোস্ট পরামর্শগুলি প্রয়োগ করার পরে, /root/show_mysql_netstat.shনিম্নলিখিত লাইনের সাথে ডাকা স্ক্রিপ্ট তৈরি করুন :

netstat | grep mysql > /root/mysql_netstat.txt
cat /root/mysql_netstat.txt | awk '{print $5}' | sed 's/:/ /g' | awk '{print $2}' | sort -u > /root/mysql_netstat_iplist.txt
for IP in `cat /root/mysql_netstat_iplist.txt`
do
        ESCOUNT=`cat /root/mysql_netstat.txt | grep ESTABLISHED | awk '{print $5}' | grep -c "${IP}"`
        TWCOUNT=`cat /root/mysql_netstat.txt | grep TIME_WAIT   | awk '{print $5}' | grep -c "${IP}"`
        IPPAD=`echo "${IP}..................................." | cut -b -35`
        (( ESCOUNT += 1000000 ))
        (( TWCOUNT += 1000000 ))
        ES=`echo ${ESCOUNT} | cut -b 3-`
        TW=`echo ${TWCOUNT} | cut -b 3-`
        echo ${IPPAD} : ESTABLISHED:${ES} TIME_WAIT:${TW}
done
echo ; echo
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n | sed 's/d)/d/'

আপনি যখন এটি চালান, আপনার এমন কিছু দেখতে পাওয়া উচিত:

[root@*** ~]# /root/ShowConnProfiles.sh
10.48.22.4......................... : ESTABLISHED:00002 TIME_WAIT:00008
10.48.22.8......................... : ESTABLISHED:00000 TIME_WAIT:00002
10.64.51.130....................... : ESTABLISHED:00001 TIME_WAIT:00000
10.64.51.133....................... : ESTABLISHED:00000 TIME_WAIT:00079
10.64.51.134....................... : ESTABLISHED:00002 TIME_WAIT:00001
10.64.51.17........................ : ESTABLISHED:00003 TIME_WAIT:01160
10.64.51.171....................... : ESTABLISHED:00002 TIME_WAIT:00000
10.64.51.174....................... : ESTABLISHED:00000 TIME_WAIT:00589
10.64.51.176....................... : ESTABLISHED:00001 TIME_WAIT:00570


      1 established
      1 Foreign
     11 LISTEN
     25 ESTABLISHED
   1301 TIME_WAIT

আপনি যদি এখনও TIME_WAITsকোনও প্রদত্ত ওয়েব সার্ভারের জন্য অনেকগুলি মেসকিউএল দেখতে পান তবে দুটি পদক্ষেপ গ্রহণের জন্য এখানে:

এসেসালেশন # 1

আপত্তিজনক ওয়েব সার্ভারে লগইন করুন এবং অ্যাপাচি নীচে হিসাবে পুনরায় চালু করুন:

service httpd stop
sleep 30
service httpd start

প্রয়োজনে সমস্ত ওয়েব সার্ভারে এটি করুন

service httpd stop (on all web servers)
service mysql stop
sleep 120
service mysql start
service httpd start (on all web servers)

এসেসালেশন # 2

নিম্নলিখিতটি দিয়ে আপনি ওএসকে মাইএসকিএল বা অন্য কোনও অ্যাপ্লিকেশনটির জন্য TIME_WAIT গুলি মারতে বাধ্য করতে পারেন:

SEC_TO_TIMEWAIT=1
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_recycle
echo ${SEC_TO_TIMEWAIT} > /proc/sys/net/ipv4/tcp_tw_reuse

এটি 1 সেকেন্ডের মধ্যে TIME_WAITs সময় শেষ করবে।

Creditণ দেওয়ার জন্য যেখানে creditণ দেওয়ার জন্য ...


1
এটির জন্য প্রায় 2 ক ভিউ এবং কেবল 2 টি ভোট (আমার সহ, তাই 1), ডাব্লুটিএফ ?! এটি একটি দুর্দান্ত উত্তর। দুঃখিত আমি কেবল 1 টি ভোট দিতে পারি!
jwbensley

আমি এই কৌশলটি চেষ্টা করেছিলাম, এবং আমার প্রচুর CLOSE_WAIT সংযোগ ছিল (2622) তবে TIME_WAIT সংযোগগুলি নয়। আমি এই ফলাফলটি কীভাবে ব্যাখ্যা করব?
রবগুইননেস

4

আপনি যদি মাইএসকিউএল সার্ভারে প্রচুর TIME_WAIT সংযোগ পান তবে তার অর্থ মাইএসকিউএল সার্ভারটি সংযোগটি বন্ধ করে দিচ্ছে। এই উদাহরণস্বরূপ সর্বাধিক সম্ভবত কেসটি হ'ল কোনও হোস্ট বা একাধিক হোস্ট ব্লক তালিকায় এসেছিল। আপনি এটি চালিয়ে সাফ করতে পারেন:

mysqladmin flush-hosts

প্রতি আইপি রান আপনার সংযোগের সংখ্যার একটি তালিকা পেতে:

 netstat -nat | awk {'print $5'} | cut -d ":" -f1 | sort | uniq -c | sort -n

3306 পোর্টে সংযোগ স্থাপন এবং টেলনেট সমস্যা হচ্ছিল এমন কোনও ক্লায়েন্টের কাছে গিয়ে আপনি এটি নিশ্চিত করতে পারেন It এটি এমন কোনও বার্তা প্রদর্শন করবে:

telnet mysqlserver 3306
Trying 192.168.1.102...
Connected to mysqlserver.
Escape character is '^]'.
sHost 'clienthost.local' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'Connection closed by foreign host.

1

আপনার যদি আপনার মাইএসকিউএল সার্ভারের সাথে প্রচুর TIME_WAIT সংযোগ থাকে তবে এর অর্থ হল আপনার কোডটি আপনার ডিবির বিরুদ্ধে প্রচুর অনুসন্ধান চালাচ্ছে এবং প্রতিটি প্রশ্নের জন্য কোনও সংযোগ খোলার / বন্ধ করে দিচ্ছে।

এই ক্ষেত্রে, আপনার মাইএসকিউএলআই এক্সটেনশন ব্যবহার করে আপনার ডিবি সার্ভারের সাথে অবিচ্ছিন্ন সংযোগ ব্যবহার করা উচিত।

http://php.net/manual/en/mysqli.persistconns.php

আপনি যদি MySQLi ব্যবহার করতে না পারেন তবে আপনার পরিবর্তে আপনার MySQL কনফিগারেশনে থ্রেড_ক্যাচি_ সাইজ প্যারামিটার ব্যবহার করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.