123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- { ** INSERT THE DEFAULT THRESHOLD VALUES **}
- INSERT INTO ph_threshold
- (id,name,task_name,value,value_type,description)
- VALUES
- (0,"LMM START THRESHOLD","Low Memory Manager","5120","NUMERIC(8.2)",
- "Low Memory Manager Start Clean Threshold.");
- INSERT INTO ph_threshold
- (id,name,task_name,value,value_type,description)
- VALUES
- (0,"LMM STOP THRESHOLD","Low Memory Manager","10240","NUMERIC(8.2)",
- "Low Memory Manager Stop Clean Threshold.");
- INSERT INTO ph_threshold
- (id,name,task_name,value,value_type,description)
- VALUES
- (0,"LMM IDLE TIME","Low Memory Manager","300","NUMERIC",
- "Low Memory Manager idle timeout.");
- {** UPDATE THE DEFAULTS WITH SAVED VALUES , IF UPGRADING **}
- UPDATE ph_threshold
- SET value = NVL ( ( SELECT value FROM ph_threshold WHERE name = "XX LMM START THRESHOLD" ) , value )
- WHERE name = "LMM START THRESHOLD";
- UPDATE ph_threshold
- SET value = NVL ( ( SELECT value FROM ph_threshold WHERE name = "XX LMM STOP THRESHOLD" ) , value )
- WHERE name = "LMM STOP THRESHOLD";
- UPDATE ph_threshold
- SET value = NVL ( ( SELECT value FROM ph_threshold WHERE name = "XX LMM IDLE TIME" ), value )
- WHERE name = "LMM IDLE TIME";
- {** REMOVE ANY SAVED THRESHOLD VALUES ** }
- DELETE FROM ph_threshold WHERE name IN
- ( "XX LMM START THRESHOLD", "XX LMM STOP THRESHOLD", "XX LMM IDLE TIME" );
- CREATE FUNCTION
- informix.low_memory_mgr_message(INTEGER, INTEGER, LVARCHAR, INTEGER DEFAULT 1 )
- RETURNS INTEGER
- EXTERNAL NAME '(dbcron_alert_msg_low_memory)'
- LANGUAGE C;
- CREATE PROCEDURE informix.kill_fat_sessions(INTEGER) external name '(kill_fat_sessions)' LANGUAGE C;
- CREATE PROCEDURE informix.kill_idle_sessions(INTEGER) external name '(kill_idle_sessions)' LANGUAGE C;
- CREATE FUNCTION informix.db_low_memory_mgr() RETURNS informix.integer
- EXTERNAL NAME '(db_low_memory_mgr)' LANGUAGE C;
- ------------------------------------------------------------------
- -- This function is used to augment the current built-in function.
- -- To enable this function to be called prior to the built-in
- -- function you must put the name of this function in the
- -- tk_execute column of the Low Memory Manager task entry.
- ------------------------------------------------------------------
- CREATE FUNCTION informix.LowMemoryManager(task_id INTEGER, task_seq INTEGER)
- RETURNING INTEGER
- DEFINE rc INTEGER;
- -- These procedures are called on all editions but
- -- on ultimate these are called by default unless you have
- -- changed the low memory manager's task attributes
- -- EXECUTE PROCEDURE kill_fat_sessions(0);
- -- EXECUTE PROCEDURE kill_idle_sessions(0);
- EXECUTE FUNCTION low_memory_mgr_message(task_id, task_seq,
- "Low Memory Activated, (additional comments here)")
- INTO rc;
- RETURN 0;
- END FUNCTION;
- CREATE FUNCTION informix.LowMemoryReconfig(task_id INTEGER, task_seq INTEGER,
- caller LVARCHAR DEFAULT "NONE" )
- RETURNING INTEGER
- DEFINE rc INTEGER;
- DEFINE idle_time BIGINT;
- DEFINE sh_total BIGINT;
- DEFINE start_threshold BIGINT;
- DEFINE stop_threshold BIGINT;
- DEFINE used_limit BIGINT;
- DEFINE used_memory BIGINT;
- DEFINE num_sessions INTEGER;
- DEFINE tmpstr CHAR(30);
- -- Do not run reconfig if LMM is not running
- SELECT COUNT(*)
- INTO rc
- FROM sysmaster:systhreads
- WHERE th_name = "LowMemoryMgr";
- IF rc = 0 THEN
- RETURN 0;
- END IF
- LET rc =0;
- SELECT NVL(MAX(value::integer) ,300)
- INTO idle_time
- FROM sysadmin:ph_threshold
- WHERE name = "LMM IDLE TIME";
-
- -- SHMTOTAL is in KB
- SELECT cf_effective
- INTO sh_total
- FROM sysmaster:sysconfig
- WHERE cf_name="SHMTOTAL";
-
- -- Default value for start threshold is 5MB (5120 KB)
- SELECT NVL(MAX(value::integer) ,5120)
- INTO start_threshold
- FROM sysadmin:ph_threshold
- WHERE name = "LMM START THRESHOLD";
- -- Threshold can be a % of SHMTOTAL, but must be 5MB < ST < 95MB
- IF start_threshold <= 50 THEN
- LET start_threshold = sh_total * (start_threshold/100.0);
- END IF
- IF start_threshold < 5120 THEN
- LET start_threshold = 5120;
- ELIF start_threshold > 95*1024 THEN
- LET start_threshold = 95*1024;
- END IF
- -- Default value for stop threshold is 10MB (10240 KB)
- SELECT NVL(MAX(value::integer) ,10240)
- INTO stop_threshold
- FROM sysadmin:ph_threshold
- WHERE name = "LMM STOP THRESHOLD";
- -- Threshold can be a % of SHMTOTAL, but must be 10MB < ST < 100MB
- IF stop_threshold <= 50 THEN
- LET stop_threshold = sh_total * (stop_threshold/100.0);
- END IF
- IF stop_threshold < 10240 THEN
- LET stop_threshold = 10240;
- ELIF stop_threshold > 100*1024 THEN
- LET stop_threshold = 100*1024;
- END IF
- -- Stop threshold must be at least Start + 5MB
- IF stop_threshold < (start_threshold + 5120) THEN
- LET stop_threshold = start_threshold + 5120;
- END IF
- LET used_limit = sh_total - stop_threshold;
- SELECT sum(seg_blkused)*4096
- INTO used_memory
- FROM sysmaster:sysseglst WHERE seg_class != 3;
- IF caller = "LMM" OR used_memory > used_limit THEN
- /* reduce system resources */
- EXECUTE FUNCTION low_memory_mgr_message(task_id, task_seq,
- "Low Memory Activated, (additional comments here)",1)
- INTO rc;
- /* Set the VP CACHE off if enabled */
- SELECT sysadmin:admin('onmode', 'wm', 'VP_MEMORY_CACHE_KB=0')
- INTO rc
- FROM sysmaster:syscfgtab
- WHERE cf_name = "VP_MEMORY_CACHE_KB" AND
- DECODE(CHARINDEX(',', cf_effective), 0, cf_effective,
- LEFT(cf_effective, CHARINDEX(',', cf_effective) -1 )) > 0;
- EXECUTE FUNCTION admin('onmode', 'F') INTO rc;
- ELIF (SELECT COUNT(*) FROM ph_run WHERE run_task_id = task_id
- AND run_time > CURRENT - INTERVAL (5) MINUTE TO MINUTE) > 0
- AND used_memory > used_limit THEN
- /* restore the system back to its normal state */
- EXECUTE FUNCTION low_memory_mgr_message(task_id, task_seq,
- "Low Memory Restored, (additional comments here)", 0)
- INTO rc;
- SELECT sysadmin:admin('onmode', 'wm', 'VP_MEMORY_CACHE_KB='||trim(cf_original))
- INTO rc
- FROM sysmaster:syscfgtab
- WHERE cf_name = "VP_MEMORY_CACHE_KB" AND
- DECODE(CHARINDEX(',', cf_original), 0, cf_original,
- LEFT(cf_original, CHARINDEX(',', cf_original) -1 )) > 0;
- EXECUTE FUNCTION admin('onmode', 'F') INTO rc;
- END IF
- RETURN rc;
- END FUNCTION;
- SET TRIGGERS FOR ph_task DISABLED;
- INSERT INTO ph_task
- (
- tk_id,
- tk_name,
- tk_type,
- tk_group,
- tk_description,
- tk_execute,
- tk_start_time,
- tk_stop_time,
- tk_frequency,
- tk_enable
- )
- VALUES
- (
- -3,
- "Low Memory Manager",
- "TASK",
- "SERVER",
- "Low memory condition has been detected so reconfigure the system accordingly.",
- NULL,
- NULL,
- NULL,
- NULL,
- 'f'
- );
- INSERT INTO ph_task
- (
- tk_name,
- tk_type,
- tk_group,
- tk_description,
- tk_execute,
- tk_start_time,
- tk_stop_time,
- tk_frequency,
- tk_next_execution
- )
- VALUES
- (
- "Low Memory Reconfig",
- "TASK",
- "SERVER",
- "Check for change in availible memory and reconfigure the system.",
- "LowMemoryReconfig",
- NULL,
- NULL,
- INTERVAL ( 60 ) MINUTE TO MINUTE,
- CURRENT + INTERVAL ( 60 ) MINUTE TO MINUTE
- );
- SET TRIGGERS FOR ph_task ENABLED;
|