Speed up RT Shreeder / or why RT shredder is so slow
לקראת שדרוג התשתיות אצלנו במשרד, החלטתי לשדרג את RT, מערכת הכרטיסים הישנה שלנו (או בשמה המלא Request Tracker ) , ואחד הדברים שרציתי זה לנקות כרטיסים ישנים וזבל מיותר שקיים במערכת (בעיקר הודעות SPAM שלא נתפסו וכ”ד).
על פי הגדרה – המערכת לא מאפשרת למחוק כרטיסים ישירות מהממשק – כל מה שניתן לעשות הוא לסמן כרטיס כמחוק – דבר שמשנה את הסטטוס שלו “למחוק” אך עדיין משאירה אותו במערכת (רק מסתירה אותו מהחיפוש הרגיל). על מנת להסיר את המידע המיותר מה-DB ממש, יש להשתמש בתוסף חיצוני (שנכון להיום הוא כבר מגיע ביחד עם חבילת המקור) שנקרא Shredder (אחלה שם אני חייב להודות). התוסף מאפשר לבצע את המחיקה ברמת ה-DB, והוא דואג למחוק גם את כל המידע שמקושר לכל כרטיס (אנשי קשר, קבצים מצורפים וכ”ו..)
באתר התעוד מצאתי 2 פקודות פשוטות שניתן להריץ משורת הפקודה וכך גם לתזמן בעתיד את המחיקה של הכרטיסים האלה דרך Cron ולא לתת להם להצטבר. הבעייה עם התוסף הנ”ל הייתה שהיה לוקח לו כ-3 שעות למחוק 25 כרטיסים – דבר שהיה הזוי לדעתי.
אז החלטתי לחקור טיפה, והפעלתי את האופציה לניטור שאילתות איטיות ב-MySQL (וגם על הדרך יצא לי להתקל בכלי בשם mytop שהוא די נחמד למעקב בזמן אמת). בסופו של דבר מצאתי כמה טבלאות שאם מוסיפים להם Index, זמן המחיקה של הכרטיסים יורד פלאים עד לכ-2.5 דקות אפילו.
הפעלת מעקב אחרי שאילתות אטיות / Log slow querys
set global slow_query_log = 'Off'; set global slow_query_log = 'On'; -- Log details for queries expected to retrieve all rows instead of using an index: set global log_queries_not_using_indexes = 'ON'; set global log_queries_not_using_indexes = 'OFF'; set global log_slow_slave_statements = 'ON'; -- Set the path to the slow query log: set global slow_query_log_file ='/var/log/mysql/slow-query.log'; -- Set the amount of time a query needs to run before being logged (default is 10 seconds): -- set global long_query_time = '10'; set global slow_launch_time = 1; set global log_slow_rate_limit = 1; set global long_query_time=1; set global slow_query_log_timestamp_precision = 'microsecond'; show variables like '%long%'; show variables like '%slow%';
set global slow_query_log = 'Off'; set global slow_query_log = 'On'; -- Log details for queries expected to retrieve all rows instead of using an index: set global log_queries_not_using_indexes = 'ON'; set global log_queries_not_using_indexes = 'OFF'; set global log_slow_slave_statements = 'ON'; -- Set the path to the slow query log: set global slow_query_log_file ='/var/log/mysql/slow-query.log'; -- Set the amount of time a query needs to run before being logged (default is 10 seconds): -- set global long_query_time = '10'; set global slow_launch_time = 1; set global log_slow_rate_limit = 1; set global long_query_time=1; set global slow_query_log_timestamp_precision = 'microsecond'; show variables like '%long%'; show variables like '%slow%';
הוספת אינדקסים / Add Index to some of the Tables
ALTER TABLE `Attachments` ADD INDEX ( `Creator` ) ALTER TABLE `Transactions` ADD INDEX ( `Creator` ) ALTER TABLE `ObjectCustomFieldValues` ADD INDEX ( `ObjectType` ) ALTER TABLE `ObjectCustomFieldValues` ADD INDEX ( `ObjectId` ) ALTER TABLE `Groups` ADD INDEX ( `LastUpdatedBy` ) ALTER TABLE `Principals` ADD INDEX ( `PrincipalType` ) ALTER TABLE `CachedGroupMembers` ADD INDEX ( `Via` ) ALTER TABLE `GroupMembers` ADD INDEX ( `LastUpdatedBy` ) ALTER TABLE `Groups` ADD INDEX ( `Creator` ) ALTER TABLE `Tickets` ADD INDEX ( `Creator` )
מקורות: