Arch memory usage

Associate
Joined
14 Jan 2004
Posts
1,518
Location
Wiltshire
Hey all,

I've got a bit of a weird problem with my Arch install...

I'm using a fairly minimal install with openbox, conky and tint2 for my desktop, and just fairly run of the mill applications. It seems like it's just being really bad at managing the system memory. Gradually the memory dial that i have setup in conky will creep up, and then when it hits 95% (of 2GB) it will start thrashing the hard drive and everything is incredibly sluggish to respond - it can take a few minutes to get an application closed to free up a bit of memory to get back in control of the system.

I've had to start using firefox instead of chromium as i can't open more than half a dozen windows in chromium before it runs out of memory....

The result of top has just shown that conky is actually using 43% of my memory!! That's new to me actually, I haven't noticed that until just now.. But surely the OS should be able to keep on top of things enough that the system doesn't just become unusable until i manage to close a couple of apps?

What are your thoughts on this guys?
 
Conky scripts are as below, and there's also a lua script to draw some circular graphics to show the results of the items measured in conkyrc_clockrings.

I'll try a very very basic conky script which just shows memory usage as a number. It's useful to have the monitor there though as i wouldn't have realised it was specifically the memory that was causing the issue without it (the possible irony being that without running conky there may have been no problem in the first place!)

script to run 3 conky scripts (vicheat is basically just some text with Vim shortcuts shown on my desktop while i learn to use it!)
Code:
#!/bin/bash
#conky -c ~/.conky/conkyrc_default &
conky -c ~/.conky/conkyrc_vicheat &
conky -c ~/.conky/conkyrc_clockrings &
conky -c ~/.conky/conkyrc_clock

conkyrc_clockrings
Code:
# Conky settings #
background no
update_interval 1

cpu_avg_samples 2
net_avg_samples 2

override_utf8_locale yes

double_buffer yes
no_buffers yes

text_buffer_size 2048
#imlib_cache_size 0

temperature_unit fahrenheit

# Window specifications #

own_window yes
own_window_type override
own_window_hints undecorate,sticky,skip_taskbar,skip_pager,below
own_window_argb_visual yes
own_window_argb_value 0

border_inner_margin 0
border_outer_margin 0

minimum_size 200 250
maximum_width 200

alignment tr
gap_x 55
gap_y 0

# Graphics settings #
draw_shades no
draw_outline no
draw_borders no
draw_graph_borders no

# Text settings #
use_xft yes
xftfont Caviar Dreams:size=8
xftalpha 0.5

uppercase no

temperature_unit celsius


default_color FFFFFF

# Lua Load  #
lua_load ~/.lua/scripts/clock_rings.lua
lua_draw_hook_pre clock_rings

TEXT
${voffset 8}${color D60650}${font Caviar Dreams:size=16}${time %A}${font}${voffset -8}${alignr 50}${color FFFFFF}${font Caviar Dreams:size=38}${time %e}${font}
${color FFFFFF}${voffset -30}${color FFFFFF}${font Caviar Dreams:size=18}${time %b}${font}${voffset -3} ${color FFFFFF}${font Caviar Dreams:size=20}${time %Y}${font}${color D60650}${hr}
${voffset 140}${font Caviar Dreams:size=10}${alignr}HOME${font}
${font Caviar Dreams:size=12}${color FFFFFF}${alignr}${weather http://weather.noaa.gov/pub/data/observations/metar/stations/ LQBK temperature temperature 30} °C${font}
${image ~/.conky/debian-logo.png -p 68,120 -s 60x60}

${color FFFFFF}${goto 70}${voffset 35}${cpu cpu0}%
${color D60650}${goto 70}CPU
${color FFFFFF}${goto 90}${voffset 33}${memperc}%
${color D60650}${goto 90}RAM
${color FFFFFF}${goto 110}${voffset 33}${fs_used_perc /swap}%
${color D60650}${goto 110}/swap
${color FFFFFF}${goto 130}${voffset 33}${fs_used_perc /}%
${color D60650}${goto 130}/root
${color FFFFFF}${goto 150}${voffset 35}${downspeed eth0}
${color FFFFFF}${goto 150}${upspeed eth0}
${color D60650}${goto 150}Net



${color FFFFFF}${font Caviar Dreams:size=8}Uptime: ${uptime_short}
${color FFFFFF}${font Caviar Dreams:size=8}Processes: ${processes}
${color FFFFFF}${font Caviar Dreams:size=8}Running: ${running_processes}


${color D60650}${font Caviar Dreams:size=8}${alignr}${nodename}
${color D60650}${font Caviar Dreams:size=8}${alignr}${pre_exec cat /etc/issue.net}  $machine
${color D60650}${font Caviar Dreams:size=8}${alignr}Kernel: ${kernel}

conkyrc_clock
Code:
alignment top_right
background yes
border_margin 5
border_width 5
default_color ffffff     	# grey 5f5f5f 3F3F3F
double_buffer yes
draw_borders no
draw_outline no
draw_shades no
gap_x 260
gap_y 30
maximum_width 240
minimum_size 175
no_buffers yes
override_utf8_locale yes
own_window yes
own_window_title conky
own_window_hints undecorated,below,sticky,skip_taskbar,skip_pager
own_window_type normal 	## normal /override /desktop
own_window_argb_visual yes
own_window_argb_value 0
text_buffer_size 8000
total_run_times 0
update_interval 0.5
uppercase no
use_xft yes
xftalpha 1
xftfont Freesans:pixelsize=9

#				fonts
#	Blue Highway
#	Zegoe Light - U
#	Zekton
#	Calibri
#	Engebrechtre
#	Opeln2001

TEXT
${font Zekton:pixelsize=45}${alignc}${time %H:%M}${font}## Zekton:pixelsize=30}${time :%S}${font}

${font Zekton:pixelsize=11}${alignc}${time  %B %d, %Y}
${alignc}${time %A}${font}

clock_rings.lua
Code:
--[[
Clock Rings by Linux Mint (2011) reEdited by despot77

This script draws percentage meters as rings, and also draws clock hands if you want! It is fully customisable; all options are described in the script. This script is based off a combination of my clock.lua script and my rings.lua script.

IMPORTANT: if you are using the 'cpu' function, it will cause a segmentation fault if it tries to draw a ring straight away. The if statement on line 145 uses a delay to make sure that this doesn't happen. It calculates the length of the delay by the number of updates since Conky started. Generally, a value of 5s is long enough, so if you update Conky every 1s, use update_num>5 in that if statement (the default). If you only update Conky every 2s, you should change it to update_num>3; conversely if you update Conky every 0.5s, you should use update_num>10. ALSO, if you change your Conky, is it best to use "killall conky; conky" to update it, otherwise the update_num will not be reset and you will get an error.

To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):
    lua_load ~/scripts/clock_rings.lua
    lua_draw_hook_pre clock_rings
    
Changelog:
+ v1.0 -- Original release (30.09.2009)
   v1.1p -- Jpope edit londonali1010 (05.10.2009)
*v 2011mint -- reEdit despot77 (18.02.2011)
]]

settings_table = {
    {
        -- Edit this table to customise your rings.
        -- You can create more rings simply by adding more elements to settings_table.
        -- "name" is the type of stat to display; you can choose from 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc'.
        name='time',
        -- "arg" is the argument to the stat type, e.g. if in Conky you would write ${cpu cpu0}, 'cpu0' would be the argument. If you would not use an argument in the Conky variable, use ''.
        arg='%I.%M',
        -- "max" is the maximum value of the ring. If the Conky variable outputs a percentage, use 100.
        max=12,
        -- "bg_colour" is the colour of the base ring.
        bg_colour=0xffffff,
        -- "bg_alpha" is the alpha value of the base ring.
        bg_alpha=0.1,
        -- "fg_colour" is the colour of the indicator part of the ring.
        fg_colour=0xD60650,
        -- "fg_alpha" is the alpha value of the indicator part of the ring.
        fg_alpha=0.2,
        -- "x" and "y" are the x and y coordinates of the centre of the ring, relative to the top left corner of the Conky window.
        x=100, y=150,
        -- "radius" is the radius of the ring.
        radius=50,
        -- "thickness" is the thickness of the ring, centred around the radius.
        thickness=5,
        -- "start_angle" is the starting angle of the ring, in degrees, clockwise from top. Value can be either positive or negative.
        start_angle=0,
        -- "end_angle" is the ending angle of the ring, in degrees, clockwise from top. Value can be either positive or negative, but must be larger than start_angle.
        end_angle=360
    },
    {
        name='time',
        arg='%M.%S',
        max=60,
        bg_colour=0xffffff,
        bg_alpha=0.1,
        fg_colour=0xD60650,
        fg_alpha=0.4,
        x=100, y=150,
        radius=56,
        thickness=5,
        start_angle=0,
        end_angle=360
    },
    {
        name='time',
        arg='%S',
        max=60,
        bg_colour=0xffffff,
        bg_alpha=0.1,
        fg_colour=0xD60650,
        fg_alpha=0.6,
        x=100, y=150,
        radius=62,
        thickness=5,
        start_angle=0,
        end_angle=360
    },
    {
        name='time',
        arg='%d',
        max=31,
        bg_colour=0xffffff,
        bg_alpha=0.1,
        fg_colour=0xD60650,
        fg_alpha=0.8,
        x=100, y=150,
        radius=70,
        thickness=5,
        start_angle=-90,
        end_angle=90
    },
    {
        name='time',
        arg='%m',
        max=12,
        bg_colour=0xffffff,
        bg_alpha=0.1,
        fg_colour=0xD60650,
        fg_alpha=1,
        x=100, y=150,
        radius=76,
        thickness=5,
        start_angle=-90,
        end_angle=90
    },
    {
        name='cpu',
        arg='cpu0',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0xD60650,
        fg_alpha=0.8,
        x=95, y=300,
        radius=25,
        thickness=5,
        start_angle=-90,
        end_angle=180
    },
    {
        name='memperc',
        arg='',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0xD60650,
        fg_alpha=0.8,
        x=115, y=360,
        radius=25,
        thickness=5,
        start_angle=-90,
        end_angle=180
    },
    {
        name='fs_used_perc',
        arg='/swap',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0xD60650,
        fg_alpha=0.8,
        x=135, y=420,
        radius=25,
        thickness=5,
        start_angle=-90,
        end_angle=180
    },
    {
        name='fs_used_perc',
        arg='/',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0xD60650,
        fg_alpha=0.8,
        x=155, y=480,
        radius=25,
        thickness=5,
        start_angle=-90,
        end_angle=180
    },
        {
        name='downspeedf',
        arg='eth0',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0x339900,
        fg_alpha=0.8,
        x=175, y=540,
        radius=25,
        thickness=4,
        start_angle=-90,
        end_angle=180
    },
        {
        name='upspeedf',
        arg='eth0',
        max=100,
        bg_colour=0xffffff,
        bg_alpha=0.2,
        fg_colour=0xff6600,
        fg_alpha=0.8,
        x=175, y=540,
        radius=20,
        thickness=4,
        start_angle=-90,
        end_angle=180
    },
}

-- Use these settings to define the origin and extent of your clock.

clock_r=65

-- "clock_x" and "clock_y" are the coordinates of the centre of the clock, in pixels, from the top left of the Conky window.

clock_x=100
clock_y=150

show_seconds=true

require 'cairo'

function rgb_to_r_g_b(colour,alpha)
    return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end

function draw_ring(cr,t,pt)
    local w,h=conky_window.width,conky_window.height
    
    local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle']
    local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha']

    local angle_0=sa*(2*math.pi/360)-math.pi/2
    local angle_f=ea*(2*math.pi/360)-math.pi/2
    local t_arc=t*(angle_f-angle_0)

    -- Draw background ring

    cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f)
    cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
    cairo_set_line_width(cr,ring_w)
    cairo_stroke(cr)
    
    -- Draw indicator ring

    cairo_arc(cr,xc,yc,ring_r,angle_0,angle_0+t_arc)
    cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
    cairo_stroke(cr)        
end

function draw_clock_hands(cr,xc,yc)
    local secs,mins,hours,secs_arc,mins_arc,hours_arc
    local xh,yh,xm,ym,xs,ys
    
    secs=os.date("%S")    
    mins=os.date("%M")
    hours=os.date("%I")
        
    secs_arc=(2*math.pi/60)*secs
    mins_arc=(2*math.pi/60)*mins+secs_arc/60
    hours_arc=(2*math.pi/12)*hours+mins_arc/12
        
    -- Draw hour hand
    
    xh=xc+0.78*clock_r*math.sin(hours_arc)
    yh=yc-0.78*clock_r*math.cos(hours_arc)
    cairo_move_to(cr,xc,yc)
    cairo_line_to(cr,xh,yh)
    
    cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND)
    cairo_set_line_width(cr,5)
    cairo_set_source_rgba(cr,1.0,1.0,1.0,1.0)
    cairo_stroke(cr)
    
    -- Draw minute hand
    
    xm=xc+0.89*clock_r*math.sin(mins_arc)
    ym=yc-0.89*clock_r*math.cos(mins_arc)
    cairo_move_to(cr,xc,yc)
    cairo_line_to(cr,xm,ym)
    
    cairo_set_line_width(cr,3)
    cairo_stroke(cr)
    
    -- Draw seconds hand
    
    if show_seconds then
        xs=xc+clock_r*math.sin(secs_arc)
        ys=yc-clock_r*math.cos(secs_arc)
        cairo_move_to(cr,xc,yc)
        cairo_line_to(cr,xs,ys)
    
        cairo_set_line_width(cr,1)
        cairo_stroke(cr)
    end
end

function conky_clock_rings()
    local function setup_rings(cr,pt)
        local str=''
        local value=0
        
        str=string.format('${%s %s}',pt['name'],pt['arg'])
        str=conky_parse(str)
        
        value=tonumber(str)
        pct=value/pt['max']
        
        draw_ring(cr,pct,pt)
    end
    
    -- Check that Conky has been running for at least 5s

    if conky_window==nil then return end
    local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height)
    
    local cr=cairo_create(cs)    
    
    local updates=conky_parse('${updates}')
    update_num=tonumber(updates)
    
    if update_num>5 then
        for i in pairs(settings_table) do
            setup_rings(cr,settings_table[i])
        end
    end
    
    draw_clock_hands(cr,clock_x,clock_y)
end
 
ive seen a bunch of those conky_rings scripts that have real bad memory leaks due to the way they use cairo, thats most likely the problem, a normal conky config shouldnt have that problem.
you might be able to fix it by adding
Code:
cairo_surface_destroy(cs)
cairo_destroy(cr)
to the end of conky_clock_rings function.

if ur set on rings a cronjob to relaunch conky every 60 mins or so might work as an ugly hack.
 
Last edited:
Back
Top Bottom