low_memory_mgr.sql 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. { ** INSERT THE DEFAULT THRESHOLD VALUES **}
  2. INSERT INTO ph_threshold
  3. (id,name,task_name,value,value_type,description)
  4. VALUES
  5. (0,"LMM START THRESHOLD","Low Memory Manager","5120","NUMERIC(8.2)",
  6. "Low Memory Manager Start Clean Threshold.");
  7. INSERT INTO ph_threshold
  8. (id,name,task_name,value,value_type,description)
  9. VALUES
  10. (0,"LMM STOP THRESHOLD","Low Memory Manager","10240","NUMERIC(8.2)",
  11. "Low Memory Manager Stop Clean Threshold.");
  12. INSERT INTO ph_threshold
  13. (id,name,task_name,value,value_type,description)
  14. VALUES
  15. (0,"LMM IDLE TIME","Low Memory Manager","300","NUMERIC",
  16. "Low Memory Manager idle timeout.");
  17. {** UPDATE THE DEFAULTS WITH SAVED VALUES , IF UPGRADING **}
  18. UPDATE ph_threshold
  19. SET value = NVL ( ( SELECT value FROM ph_threshold WHERE name = "XX LMM START THRESHOLD" ) , value )
  20. WHERE name = "LMM START THRESHOLD";
  21. UPDATE ph_threshold
  22. SET value = NVL ( ( SELECT value FROM ph_threshold WHERE name = "XX LMM STOP THRESHOLD" ) , value )
  23. WHERE name = "LMM STOP THRESHOLD";
  24. UPDATE ph_threshold
  25. SET value = NVL ( ( SELECT value FROM ph_threshold WHERE name = "XX LMM IDLE TIME" ), value )
  26. WHERE name = "LMM IDLE TIME";
  27. {** REMOVE ANY SAVED THRESHOLD VALUES ** }
  28. DELETE FROM ph_threshold WHERE name IN
  29. ( "XX LMM START THRESHOLD", "XX LMM STOP THRESHOLD", "XX LMM IDLE TIME" );
  30. CREATE FUNCTION
  31. informix.low_memory_mgr_message(INTEGER, INTEGER, LVARCHAR, INTEGER DEFAULT 1 )
  32. RETURNS INTEGER
  33. EXTERNAL NAME '(dbcron_alert_msg_low_memory)'
  34. LANGUAGE C;
  35. CREATE PROCEDURE informix.kill_fat_sessions(INTEGER) external name '(kill_fat_sessions)' LANGUAGE C;
  36. CREATE PROCEDURE informix.kill_idle_sessions(INTEGER) external name '(kill_idle_sessions)' LANGUAGE C;
  37. CREATE FUNCTION informix.db_low_memory_mgr() RETURNS informix.integer
  38. EXTERNAL NAME '(db_low_memory_mgr)' LANGUAGE C;
  39. ------------------------------------------------------------------
  40. -- This function is used to augment the current built-in function.
  41. -- To enable this function to be called prior to the built-in
  42. -- function you must put the name of this function in the
  43. -- tk_execute column of the Low Memory Manager task entry.
  44. ------------------------------------------------------------------
  45. CREATE FUNCTION informix.LowMemoryManager(task_id INTEGER, task_seq INTEGER)
  46. RETURNING INTEGER
  47. DEFINE rc INTEGER;
  48. -- These procedures are called on all editions but
  49. -- on ultimate these are called by default unless you have
  50. -- changed the low memory manager's task attributes
  51. -- EXECUTE PROCEDURE kill_fat_sessions(0);
  52. -- EXECUTE PROCEDURE kill_idle_sessions(0);
  53. EXECUTE FUNCTION low_memory_mgr_message(task_id, task_seq,
  54. "Low Memory Activated, (additional comments here)")
  55. INTO rc;
  56. RETURN 0;
  57. END FUNCTION;
  58. CREATE FUNCTION informix.LowMemoryReconfig(task_id INTEGER, task_seq INTEGER,
  59. caller LVARCHAR DEFAULT "NONE" )
  60. RETURNING INTEGER
  61. DEFINE rc INTEGER;
  62. DEFINE idle_time BIGINT;
  63. DEFINE sh_total BIGINT;
  64. DEFINE start_threshold BIGINT;
  65. DEFINE stop_threshold BIGINT;
  66. DEFINE used_limit BIGINT;
  67. DEFINE used_memory BIGINT;
  68. DEFINE num_sessions INTEGER;
  69. DEFINE tmpstr CHAR(30);
  70. -- Do not run reconfig if LMM is not running
  71. SELECT COUNT(*)
  72. INTO rc
  73. FROM sysmaster:systhreads
  74. WHERE th_name = "LowMemoryMgr";
  75. IF rc = 0 THEN
  76. RETURN 0;
  77. END IF
  78. LET rc =0;
  79. SELECT NVL(MAX(value::integer) ,300)
  80. INTO idle_time
  81. FROM sysadmin:ph_threshold
  82. WHERE name = "LMM IDLE TIME";
  83. -- SHMTOTAL is in KB
  84. SELECT cf_effective
  85. INTO sh_total
  86. FROM sysmaster:sysconfig
  87. WHERE cf_name="SHMTOTAL";
  88. -- Default value for start threshold is 5MB (5120 KB)
  89. SELECT NVL(MAX(value::integer) ,5120)
  90. INTO start_threshold
  91. FROM sysadmin:ph_threshold
  92. WHERE name = "LMM START THRESHOLD";
  93. -- Threshold can be a % of SHMTOTAL, but must be 5MB < ST < 95MB
  94. IF start_threshold <= 50 THEN
  95. LET start_threshold = sh_total * (start_threshold/100.0);
  96. END IF
  97. IF start_threshold < 5120 THEN
  98. LET start_threshold = 5120;
  99. ELIF start_threshold > 95*1024 THEN
  100. LET start_threshold = 95*1024;
  101. END IF
  102. -- Default value for stop threshold is 10MB (10240 KB)
  103. SELECT NVL(MAX(value::integer) ,10240)
  104. INTO stop_threshold
  105. FROM sysadmin:ph_threshold
  106. WHERE name = "LMM STOP THRESHOLD";
  107. -- Threshold can be a % of SHMTOTAL, but must be 10MB < ST < 100MB
  108. IF stop_threshold <= 50 THEN
  109. LET stop_threshold = sh_total * (stop_threshold/100.0);
  110. END IF
  111. IF stop_threshold < 10240 THEN
  112. LET stop_threshold = 10240;
  113. ELIF stop_threshold > 100*1024 THEN
  114. LET stop_threshold = 100*1024;
  115. END IF
  116. -- Stop threshold must be at least Start + 5MB
  117. IF stop_threshold < (start_threshold + 5120) THEN
  118. LET stop_threshold = start_threshold + 5120;
  119. END IF
  120. LET used_limit = sh_total - stop_threshold;
  121. SELECT sum(seg_blkused)*4096
  122. INTO used_memory
  123. FROM sysmaster:sysseglst WHERE seg_class != 3;
  124. IF caller = "LMM" OR used_memory > used_limit THEN
  125. /* reduce system resources */
  126. EXECUTE FUNCTION low_memory_mgr_message(task_id, task_seq,
  127. "Low Memory Activated, (additional comments here)",1)
  128. INTO rc;
  129. /* Set the VP CACHE off if enabled */
  130. SELECT sysadmin:admin('onmode', 'wm', 'VP_MEMORY_CACHE_KB=0')
  131. INTO rc
  132. FROM sysmaster:syscfgtab
  133. WHERE cf_name = "VP_MEMORY_CACHE_KB" AND
  134. DECODE(CHARINDEX(',', cf_effective), 0, cf_effective,
  135. LEFT(cf_effective, CHARINDEX(',', cf_effective) -1 )) > 0;
  136. EXECUTE FUNCTION admin('onmode', 'F') INTO rc;
  137. ELIF (SELECT COUNT(*) FROM ph_run WHERE run_task_id = task_id
  138. AND run_time > CURRENT - INTERVAL (5) MINUTE TO MINUTE) > 0
  139. AND used_memory > used_limit THEN
  140. /* restore the system back to its normal state */
  141. EXECUTE FUNCTION low_memory_mgr_message(task_id, task_seq,
  142. "Low Memory Restored, (additional comments here)", 0)
  143. INTO rc;
  144. SELECT sysadmin:admin('onmode', 'wm', 'VP_MEMORY_CACHE_KB='||trim(cf_original))
  145. INTO rc
  146. FROM sysmaster:syscfgtab
  147. WHERE cf_name = "VP_MEMORY_CACHE_KB" AND
  148. DECODE(CHARINDEX(',', cf_original), 0, cf_original,
  149. LEFT(cf_original, CHARINDEX(',', cf_original) -1 )) > 0;
  150. EXECUTE FUNCTION admin('onmode', 'F') INTO rc;
  151. END IF
  152. RETURN rc;
  153. END FUNCTION;
  154. SET TRIGGERS FOR ph_task DISABLED;
  155. INSERT INTO ph_task
  156. (
  157. tk_id,
  158. tk_name,
  159. tk_type,
  160. tk_group,
  161. tk_description,
  162. tk_execute,
  163. tk_start_time,
  164. tk_stop_time,
  165. tk_frequency,
  166. tk_enable
  167. )
  168. VALUES
  169. (
  170. -3,
  171. "Low Memory Manager",
  172. "TASK",
  173. "SERVER",
  174. "Low memory condition has been detected so reconfigure the system accordingly.",
  175. NULL,
  176. NULL,
  177. NULL,
  178. NULL,
  179. 'f'
  180. );
  181. INSERT INTO ph_task
  182. (
  183. tk_name,
  184. tk_type,
  185. tk_group,
  186. tk_description,
  187. tk_execute,
  188. tk_start_time,
  189. tk_stop_time,
  190. tk_frequency,
  191. tk_next_execution
  192. )
  193. VALUES
  194. (
  195. "Low Memory Reconfig",
  196. "TASK",
  197. "SERVER",
  198. "Check for change in availible memory and reconfigure the system.",
  199. "LowMemoryReconfig",
  200. NULL,
  201. NULL,
  202. INTERVAL ( 60 ) MINUTE TO MINUTE,
  203. CURRENT + INTERVAL ( 60 ) MINUTE TO MINUTE
  204. );
  205. SET TRIGGERS FOR ph_task ENABLED;