Really it all depends on the application(s), however you can use the method employed by the kernel to determine memory pressure which should give you a general overview on the hosts capability to manage the memory.
Memory pressure is ideal since it is devoid of worrying about page cache, swappiness or even how much memory you actually have.
Memory pressure is effectively a count of how many pages want to be marked active as per /proc/meminfo. The kernel measures memory pressure by keeping track of how many pages go from 'inactive' to 'active' in the page table. A lot of shifting between these two statuses indicates you probably do not have a lot of spare memory available to make more pages active.
Low memory pressure is indicated by having very few promotions from inactive to active (because the kernel clearly has enough space to make active pages stay active).
This script will measure pressure every PERIODIC seconds. The more data you can collect the better. The idea here is you graph the data and stick your Y axis with 0 at the centre. In ideal circumstances the graph should a horizontal line following 0. If the lines regularly spike outside of 0 (particularly 'Active' being positive, or spiking quite high regularly), the memory pressure on the host is high and more memory would be beneficial.
PERIODIC = 1
pgs = re.compile('Active:\s+([0-9]+) kB\nInactive:\s+([0-9]+) kB')
meminfo = open('/proc/meminfo')
content = meminfo.read(4096)
m = pgs.search(content, re.M)
active, inactive = int(m.group(1)), int(m.group(2))
active = active / 4
inactive = inactive / 4
if __name__ == "__main__":
oldin, oldac = read_meminfo()
active, inactive = read_meminfo()
print "Inactive Pressure:\t%d" % (inactive - oldin)
print "Active Pressure:\t%d" % (active - oldac)
oldac = active
oldin = inactive