আমি বিভিন্ন বিভিন্ন গ্রাহক দ্বারা ব্যবহৃত একটি সফটওয়্যার-হিসাবে-পরিষেবা অ্যাপ্লিকেশনটির সিনিয়র বিকাশকারী। আমাদের সফ্টওয়্যারটি মাইএসকিউএল ব্যাকএন্ড দ্বারা চালিত, অ্যাপাচি / পিএইচপি অ্যাপ্লিকেশন সার্ভারের একটি ক্লাস্টারে চলে। উপর এক সফটওয়্যার নির্দিষ্ট উদাহরণস্বরূপ, বিভাগ নামের তালিকা ক্যোয়ারীতে পিএইচপি কোড আউট সময়জ্ঞান হয় যখন গ্রাহক চেয়ে বেশি 29 বিভাগ আছে । আমি জানি এটি কোনও অর্থবহ নয়; 30 নম্বর সম্পর্কে বিশেষ কিছু নেই যা এটি ভেঙে দেবে এবং অন্যান্য গ্রাহকদের 30 টিরও বেশি বিভাগ থাকবে তবে যাইহোক, সমস্যাটি 100% প্রজননযোগ্য যখন এই ইনস্টলটিতে 30 বা ততোধিক বিভাগ থাকে এবং 30 টিরও কম বিভাগ থাকলেই চলে যায়।
প্রশ্নে সারণীটি হ'ল:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) unsigned NOT NULL auto_increment,
`name` varchar(64) NOT NULL,
`title` varchar(128) NOT NULL,
`parent` int(10) unsigned NOT NULL,
`keywords` varchar(255) NOT NULL,
`description` text NOT NULL,
`status` enum('Active','Inactive','_Deleted','_New') NOT NULL default 'Active',
`style` enum('_Unknown') default NULL COMMENT 'Autoenum;',
`order` smallint(5) unsigned NOT NULL,
`created_at` datetime NOT NULL,
`modified_at` datetime default NULL,
PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `parent` (`parent`),
KEY `created_at` (`created_at`),
KEY `modified_at` (`modified_at`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='R2' AUTO_INCREMENT=33 ;
প্রশ্নের মধ্যে কোডটি পুনরায় ক্রমশ সমস্ত বিভাগ আনতে সারণিকে জিজ্ঞাসা করে। এটি ই
SELECT * FROM `categories` WHERE `parent`=0 ORDER BY `order`,`name`
এবং তারপরে ফিরে আসা প্রতিটি সারির জন্য এই ক্যোয়ারী পুনরাবৃত্তি করে তবে WHERE parent=$category_idপ্রতিটি সময় ব্যবহার করে। (আমি নিশ্চিত যে এই পদ্ধতিটি উন্নত করা যেতে পারে তবে এটি সম্ভবত অন্য একটি প্রশ্ন)
আমি যতদূর বলতে পারি, নিম্নলিখিত কোয়েরিটি চিরকাল ঝুলছে:
SELECT * FROM `categories` WHERE `parent`=22 ORDER BY `order`,`name`
আমি সার্ভারের মাইএসকিএল ক্লায়েন্টে এই ক্যোয়ারীটি পুরোপুরি সূক্ষ্মভাবে সম্পাদন করতে পারি এবং আমি পিএইচপিএমআইএডমিনে সমস্যা ছাড়াই এটি সম্পাদন করতে পারি।
মনে রাখবেন যে এটি সেই নির্দিষ্ট কোয়েরি নয় যা সমস্যা। আমি যদি DELETE FROM categories WHERE id=22তখন উপরেরটির মতো একটি আলাদা কোয়েরি হ্যাং করব। এছাড়াও, আমি যখন ম্যানুয়ালি এটি চালাচ্ছি তখন উপরের ক্যোয়ারী শূন্য সারিগুলি দেয় ।
আমার সন্দেহ টেবিল দুর্নীতিগ্রস্ত হতে পারে, এবং আমি চেষ্টা REPAIR TABLEএবং OPTIMIZE TABLEকিন্তু এগুলোর নিম্নস্থ সমস্যার রিপোর্ট কিংবা ইস্যু সমাধান। আমি টেবিলটি ফেলে দিয়ে পুনরায় তৈরি করেছি, তবে সমস্যাটি ফিরে এল। এটি ঠিক একই টেবিল কাঠামো এবং পিএইচপি কোড অন্য গ্রাহকরা 30 টিরও বেশি বিভাগযুক্ত গ্রাহকগণ সহ অন্য কারও জন্য কোনও সমস্যা ছাড়াই ব্যবহার করছেন।
পিএইচপি কোড চিরতরে পুনরাবৃত্তি হচ্ছে না । (এটি নয় এবং অসীম লুপ)
মাইএসকিউএল সার্ভার i686 (মাইএসকিউএল কমিউনিটি এডিশন (জিপিএল) - তে পিসি-লিনাক্স-জিএনএনউর জন্য মাইএসকিএলড ভার্ 5.0.92-সম্প্রদায়ের সাথে সেন্টোজ লিনাক্স চালাচ্ছে
মাইএসকিউএল সার্ভারে লোড কম: লোড গড়: 0.5x, 0.75, 0.73, সিপু (গুলি): 4.6% আমাদের, 2.9% সিআই, 0.0% নী, 92.2% আইডি, 0.0% ওয়া, 0.0% হাই, 0.3% সি, 0.0% ম। অবহেলিত অদলবদল (448 কে) ব্যবহৃত হচ্ছে
আমি কীভাবে এই সমস্যাটি সমাধান করব? কি হতে পারে কোন পরামর্শ?
আপডেট: আমি TRUNCEটেবিলটি সম্পাদনা করেছি এবং 30 টি সারি ডামি ডেটা sertedুকিয়েছি:
INSERT INTO `categories` (`id`, `name`, `title`, `parent`, `keywords`, `description`, `status`, `style`, `order`, `created_at`, `modified_at`) VALUES
(1, 'New Category', '', 0, '', '', 'Inactive', NULL, 1, '2011-10-25 12:06:30', '2011-10-25 12:06:34'),
(2, 'New Category', '', 0, '', '', 'Inactive', NULL, 2, '2011-10-25 12:06:39', '2011-10-25 12:06:40'),
(3, 'New Category', '', 0, '', '', 'Inactive', NULL, 3, '2011-10-25 12:06:41', '2011-10-25 12:06:42'),
(4, 'New Category', '', 0, '', '', 'Inactive', NULL, 4, '2011-10-25 12:06:46', '2011-10-25 12:06:47'),
(5, 'New Category', '', 0, '', '', 'Inactive', NULL, 5, '2011-10-25 12:06:49', NULL),
(6, 'New Category', '', 0, '', '', 'Inactive', NULL, 6, '2011-10-25 12:06:51', '2011-10-25 12:06:52'),
(7, 'New Category', '', 0, '', '', 'Inactive', NULL, 7, '2011-10-25 12:06:53', '2011-10-25 12:06:54'),
(8, 'New Category', '', 0, '', '', 'Inactive', NULL, 8, '2011-10-25 12:06:56', '2011-10-25 12:06:57'),
(9, 'New Category', '', 0, '', '', 'Inactive', NULL, 9, '2011-10-25 12:06:59', '2011-10-25 12:06:59'),
(10, 'New Category', '', 0, '', '', 'Inactive', NULL, 10, '2011-10-25 12:07:01', '2011-10-25 12:07:01'),
(11, 'New Category', '', 0, '', '', 'Inactive', NULL, 11, '2011-10-25 12:07:03', '2011-10-25 12:07:03'),
(12, 'New Category', '', 0, '', '', 'Inactive', NULL, 12, '2011-10-25 12:07:05', '2011-10-25 12:07:05'),
(13, 'New Category', '', 0, '', '', 'Inactive', NULL, 13, '2011-10-25 12:07:06', '2011-10-25 12:07:07'),
(14, 'New Category', '', 0, '', '', 'Inactive', NULL, 14, '2011-10-25 12:07:08', '2011-10-25 12:07:09'),
(15, 'New Category', '', 0, '', '', 'Inactive', NULL, 15, '2011-10-25 12:07:11', '2011-10-25 12:07:12'),
(16, 'New Category', '', 0, '', '', 'Inactive', NULL, 16, '2011-10-25 12:07:13', '2011-10-25 12:07:14'),
(17, 'New Category', '', 0, '', '', 'Inactive', NULL, 17, '2011-10-25 12:09:41', '2011-10-25 12:09:42'),
(18, 'New Category', '', 0, '', '', 'Inactive', NULL, 18, '2011-10-25 12:09:47', NULL),
(19, 'New Category', '', 0, '', '', 'Inactive', NULL, 19, '2011-10-25 12:09:48', NULL),
(20, 'New Category', '', 0, '', '', 'Inactive', NULL, 20, '2011-10-25 12:09:48', NULL),
(21, 'New Category', '', 0, '', '', 'Inactive', NULL, 21, '2011-10-25 12:09:49', NULL),
(22, 'New Category', '', 0, '', '', 'Inactive', NULL, 22, '2011-10-25 12:09:50', NULL),
(23, 'New Category', '', 0, '', '', 'Inactive', NULL, 23, '2011-10-25 12:09:51', NULL),
(24, 'New Category', '', 0, '', '', 'Inactive', NULL, 24, '2011-10-25 12:09:51', NULL),
(25, 'New Category', '', 0, '', '', 'Inactive', NULL, 25, '2011-10-25 12:09:52', NULL),
(26, 'New Category', '', 0, '', '', 'Inactive', NULL, 26, '2011-10-25 12:09:53', NULL),
(27, 'New Category', '', 0, '', '', 'Inactive', NULL, 27, '2011-10-25 12:09:54', NULL),
(28, 'New Category', '', 0, '', '', 'Inactive', NULL, 28, '2011-10-25 12:09:55', NULL),
(29, 'New Category', '', 0, '', '', 'Inactive', NULL, 29, '2011-10-25 12:09:56', NULL),
(30, 'New Category', '', 0, '', '', 'Inactive', NULL, 30, '2011-10-25 12:09:57', NULL);
কোনও পিতামাতাই মোটেই নেই , সমস্ত বিভাগ শীর্ষ স্তরে। সমস্যা এখনও আছে। নিম্নলিখিত ক্যোয়ারী, পিএইচপি দ্বারা সম্পাদিত, ব্যর্থ:
SELECT * FROM `categories` WHERE `parent`=22 ORDER BY `order`,`name`
এখানে EXPLAIN:
mysql> EXPLAIN SELECT * FROM `categories` WHERE `parent`=22 ORDER BY `order`,`name`;
+----+-------------+------------+------+---------------+--------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+--------+---------+-------+------+-----------------------------+
| 1 | SIMPLE | categories | ref | parent | parent | 4 | const | 1 | Using where; Using filesort |
+----+-------------+------------+------+---------------+--------+---------+-------+------+-----------------------------+
1 row in set (0.00 sec)
আপডেট # 2: আমি এখন নিম্নলিখিত সমস্ত চেষ্টা করেছি:
- আমি এই টেবিল এবং ডেটা একই সফ্টওয়্যার দিয়ে একটি অন্য সাইটে অনুলিপি করেছি। সমস্যা হয়নি না টেবিল অনুসরণ করুন। এটি এই একটি ডাটাবেসের মধ্যে সীমাবদ্ধ বলে মনে হচ্ছে।
- জিবিএন এর উত্তর প্রস্তাবিত হিসাবে আমি সূচকটি পরিবর্তন করেছি। সমস্যা থেকেই গেল।
- আমি টেবিলটি বাদ দিয়ে একটি
InnoDBটেবিল হিসাবে পুনরায় তৈরি করেছি এবং উপরে একই 30 টি সারি সন্নিবেশ করিয়েছি। সমস্যা থেকেই গেল।
আমার সন্দেহ হয় এটি অবশ্যই এই ডেটাবেসটির সাথে কিছু হতে পারে ...
আপডেট # 3: আমি সম্পূর্ণভাবে ডাটাবেসটি ফেলে দিয়েছিলাম এবং তার ডেটা আমদানি করে একটি নতুন নামে এটি পুনরায় তৈরি করেছি। সমস্যা থেকেই যায়।
আমি দেখেছি যে প্রকৃত পিএইচপি স্টেটমেন্ট যা হ্যাং করার জন্য একটি কল mysql_query()। এর পরের বিবৃতিগুলি কখনই কার্যকর করা হয় না।
সেই কলটি যখন স্তব্ধ হয়ে যায়, তখন মাইএসকিউএল থ্রেডটিকে ঘুমন্ত হিসাবে তালিকাভুক্ত করে !
mysql> show full processlist;
+-------+------------------+-----------------------------+----------------------+---------+------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------------------+-----------------------------+----------------------+---------+------+-------+-----------------------+
| 5560 | root | localhost | problem_db | Query | 0 | NULL | show full processlist |
----- many rows which have no relevancy; only rows from this customer's app are shown ------
| 16341 | shared_db | oak01.sitepalette.com:53237 | shared_db | Sleep | 308 | | NULL |
| 16342 | problem_db | oak01.sitepalette.com:60716 | problem_db | Sleep | 307 | | NULL |
| 16344 | shared_db | oak01.sitepalette.com:53241 | shared_db | Sleep | 308 | | NULL |
| 16346 | problem_db | oak01.sitepalette.com:60720 | problem_db | Sleep | 308 | | NULL |
+-------+------------------+-----------------------------+----------------------+---------+------+-------+-----------------------+
আপডেট # 4: আমি এটিকে দুটি টেবিলের সংমিশ্রণে সংক্ষিপ্ত করে রেখেছি , categoriesউপরে বর্ণিত media_imagesসারণী এবং 556 সারি সহ একটি সারণী। যদি media_imagesটেবিলটিতে 556 টিরও কম সারি থাকে, বা categoriesটেবিলটিতে 30 টিরও কম সারি থাকে, সমস্যাটি চলে যায়। এটি এখানে একরকম মাইএসকিউএল সীমাবদ্ধতার মতো সীমাবদ্ধ বলে মনে হচ্ছে ...
আপডেট # 5: আমি কেবল ডেটাবেসটিকে সম্পূর্ণ আলাদা মাইএসকিউএল সার্ভারে স্থানান্তরিত করার চেষ্টা করেছি এবং সমস্যাটি চলে গেল ... সুতরাং এটি আমার প্রোডাকশন ডেটাবেস সার্ভারের সাথে সম্পর্কিত ...
আপডেট #:: এখানে পিএইচপি সম্পর্কিত প্রাসঙ্গিক কোড যা প্রতিটি সময় ঝুলে থাকে:
public function find($type,$conditions='',$order='',$limit='')
{
if($this->_link == self::AUTO_LINK)
$this->_link = DFStdLib::database_connect();
if(is_resource($this->_link))
{
$q = "SELECT ".($type==_COUNT?'COUNT(*)':'*')." FROM `{$this->_table}`";
if($conditions)
{
$q .= " WHERE $conditions";
}
if($order)
{
$q .= " ORDER BY $order";
}
if($limit)
{
$q .= " LIMIT $limit";
}
switch($type)
{
case _ALL:
DFSkel::log(DFSkel::LOG_DEBUG,"mysql_query($q,$this->_link);");
$res = @mysql_query($q,$this->_link);
DFSkel::log(DFSkel::LOG_DEBUG,"res = $res");
এই কোডটি উত্পাদনে রয়েছে এবং অন্যান্য সমস্ত ইনস্টলগুলিতে সূক্ষ্মভাবে কাজ করে। কেবল একটি ইনস্টলের উপর, এটি স্তব্ধ $res = @mysql_query($q,$this->_link);। আমি জানি কারণ আমি mysql_queryডিবাগ লগটিতে দেখি , এবং না res =এবং যখন আমি straceপিএইচপি প্রক্রিয়া করি তখন এটি স্তব্ধ হয়ে যায়read(
আপডেট করুন # যাই হোক না কেন এটি আই-ঘৃণা- এটি- এবং (# ^ & -সিসু! এটি এখন আমার দুই গ্রাহকের সাথেই ঘটতে শুরু করেছে I আমি সবেমাত্র আপ চালিয়েছিtcpdump এবং দেখে মনে হচ্ছে মাইএসকিউএল থেকে প্রাপ্ত প্রতিক্রিয়া কখনই পুরোপুরি প্রেরণ হয় নি। পুরো মাইএসকিউএল প্রতিক্রিয়া প্রেরণের আগে টিসিপি স্ট্রিমটি কেবল স্তব্ধ হয়ে গেছে বলে মনে হচ্ছে ((আমি এখনও তদন্ত করছি)
আপডেট # আমি-সম্পূর্ণ-পাগল-তবে-এটি-এখন-ধরণের কাজ করে: ঠিক আছে, এটি কোনও অর্থ দেয় না, তবে আমি একটি সমাধান খুঁজে পেয়েছি। আমি যদি মাইএসকিউএল সার্ভারের eth2ইন্টারফেসে একটি দ্বিতীয় আইপি ঠিকানা বরাদ্দ করি এবং এনএফএস ট্র্যাফিকের জন্য একটি আইপি এবং মাইএসকিউএলের জন্য দ্বিতীয় আইপি ব্যবহার করি, তবে সমস্যাটি চলে যায়। দেখে মনে হচ্ছে আমি কোনওভাবেই ... আইপি ঠিকানাটি ওভারলোড করছি যদি এনএফএস + মাইএসকিউএল ট্র্যাফিক উভয়ই সেই আইপিতে যায়। তবে এটি শূন্য করে তোলে কারণ আপনি একটি আইপি ঠিকানা "ওভারলোড" করতে পারবেন না। একটি ইন্টারফেস নিশ্চিত, তবে এটি একই ইন্টারফেস সন্তুষ্টি।
কোন ধারণা এখানে কি চলছে? এটি সম্ভবত এই সময়ে একটি ইউনিক্স.এসই বা সার্ভারফল্ট প্রশ্ন ... (কমপক্ষে এটি এখন কাজ করে ...)
আপডেট # কেন-ও-কেন: এই সমস্যাটি এখনও চলছে। এটি দুটি পৃথক আইপি ব্যবহার করেও ঘটতে শুরু করেছে। আমি নতুন ব্যক্তিগত আইপি তৈরি করতে পারি, তবে স্পষ্টতই কিছু ভুল।