made the default cache size depend on the amount of physical RAM. and fixed disk thread settings update when loading through load_state

This commit is contained in:
Arvid Norberg 2010-03-10 07:14:10 +00:00
parent cbc93c8de8
commit 79bd8fcd52
7 changed files with 76 additions and 15 deletions

View File

@ -1,3 +1,4 @@
* made the default cache size depend on available physical RAM
* added flags to torrent::status() that can filter which values are calculated * added flags to torrent::status() that can filter which values are calculated
* support 'explicit read cache' which keeps a specific set of pieces * support 'explicit read cache' which keeps a specific set of pieces
in the read cache, without implicitly caching other pieces in the read cache, without implicitly caching other pieces

View File

@ -4060,10 +4060,12 @@ in parole mode fails the hash check, it is banned. If a peer participates in a
piece that passes the hash check, it is taken out of parole mode. piece that passes the hash check, it is taken out of parole mode.
``cache_size`` is the disk write and read cache. It is specified in units of ``cache_size`` is the disk write and read cache. It is specified in units of
16 KiB blocks. It defaults to 1024 (= 16 MB). Buffers that are part of a peer's 16 KiB blocks. Buffers that are part of a peer's send or receive buffer also
send or receive buffer also count against this limit. Send and receive buffers count against this limit. Send and receive buffers will never be denied to be
will never be denied to be allocated, but they will cause the actual cached blocks allocated, but they will cause the actual cached blocks to be flushed or evicted.
to be flushed or evicted. If this is set to -1, the cache size is automatically set to the amount
of physical RAM available in the machine divided by 8. If the amount of physical
RAM cannot be determined, it's set to 1024 (= 16 MiB).
Disk buffers are allocated using a pool allocator, the number of blocks that Disk buffers are allocated using a pool allocator, the number of blocks that
are allocated at a time when the pool needs to grow can be specified in are allocated at a time when the pool needs to grow can be specified in

View File

@ -390,6 +390,7 @@ namespace libtorrent
// private: // private:
void update_disk_thread_settings();
void on_dht_state_callback(condition& c void on_dht_state_callback(condition& c
, entry& e, bool& done) const; , entry& e, bool& done) const;
void on_lsd_peer(tcp::endpoint peer, sha1_hash const& ih); void on_lsd_peer(tcp::endpoint peer, sha1_hash const& ih);

View File

@ -431,6 +431,9 @@ namespace libtorrent
std::ofstream m_log; std::ofstream m_log;
#endif #endif
// the amount of physical ram in the machine
boost::uint64_t m_physical_ram;
io_service& m_ios; io_service& m_ios;
boost::function<void()> m_queue_callback; boost::function<void()> m_queue_callback;

View File

@ -434,7 +434,9 @@ namespace libtorrent
bool use_parole_mode; bool use_parole_mode;
// the disk write cache, specified in 16 KiB blocks. // the disk write cache, specified in 16 KiB blocks.
// default is 512 (= 8 MB) // default is 1024 (= 16 MiB). -1 means automatic, which
// adjusts the cache size depending on the amount
// of physical RAM in the machine.
int cache_size; int cache_size;
// this is the number of disk buffer blocks (16 kiB) // this is the number of disk buffer blocks (16 kiB)

View File

@ -51,6 +51,10 @@ POSSIBILITY OF SUCH DAMAGE.
#include <sys/mman.h> #include <sys/mman.h>
#endif #endif
#ifdef TORRENT_BSD
#include <sys/sysctl.h>
#endif
namespace libtorrent namespace libtorrent
{ {
bool should_cancel_on_abort(disk_io_job const& j); bool should_cancel_on_abort(disk_io_job const& j);
@ -288,6 +292,7 @@ namespace libtorrent
, m_waiting_to_shutdown(false) , m_waiting_to_shutdown(false)
, m_queue_buffer_size(0) , m_queue_buffer_size(0)
, m_last_file_check(time_now_hires()) , m_last_file_check(time_now_hires())
, m_physical_ram(0)
, m_ios(ios) , m_ios(ios)
, m_queue_callback(queue_callback) , m_queue_callback(queue_callback)
, m_work(io_service::work(m_ios)) , m_work(io_service::work(m_ios))
@ -297,6 +302,40 @@ namespace libtorrent
#ifdef TORRENT_DISK_STATS #ifdef TORRENT_DISK_STATS
m_log.open("disk_io_thread.log", std::ios::trunc); m_log.open("disk_io_thread.log", std::ios::trunc);
#endif #endif
// figure out how much physical RAM there is in
// this machine. This is used for automatically
// sizing the disk cache size when it's set to
// automatic.
#ifdef TORRENT_BSD
int mib[2] = { CTL_HW, HW_MEMSIZE };
size_t len = sizeof(m_physical_ram);
if (sysctl(mib, 2, &m_physical_ram, &len, NULL, 0) != 0)
m_physical_ram = 0;
#elif defined TORRENT_WINDOWS
MEMORYSTATUSEX ms;
if (GlobalMemoryStatusEx(&ms))
m_physical_ram = ms.ullTotalPhys;
else
m_physical_ram = 0;
#elif defined TORRENT_LINUX
m_physical_ram = sysconf(_SC_PHYS_PAGES);
m_physical_ram *= sysconf(_SC_PAGESIZE);
#elif defined TORRENT_AMIGA
m_physical_ram = AvailMem(MEMF_PUBLIC);
#endif
#if TORRENT_USE_RLIMIT
if (m_physical_ram > 0)
{
struct rlimit r;
if (getrlimit(RLIMIT_AS, &r) == 0 && r.rlim_cur != RLIM_INFINITY)
{
if (m_physical_ram > r.rlim_cur)
m_physical_ram = r.rlim_cur;
}
}
#endif
} }
disk_io_thread::~disk_io_thread() disk_io_thread::~disk_io_thread()
@ -1629,6 +1668,17 @@ namespace libtorrent
setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD setiopolicy_np(IOPOL_TYPE_DISK, IOPOL_SCOPE_THREAD
, m_settings.low_prio_disk ? IOPOL_THROTTLE : IOPOL_DEFAULT); , m_settings.low_prio_disk ? IOPOL_THROTTLE : IOPOL_DEFAULT);
#endif #endif
if (m_settings.cache_size == -1)
{
// the cache size is set to automatic. Make it
// depend on the amount of physical RAM
// if we don't know how much RAM we have, just set the
// cache size to 16 MiB (1024 blocks)
if (m_physical_ram == 0)
m_settings.cache_size = 1024;
else
m_settings.cache_size = m_physical_ram / 8 / m_block_size;
}
break; break;
} }
case disk_io_job::abort_torrent: case disk_io_job::abort_torrent:

View File

@ -762,10 +762,8 @@ namespace aux {
{ {
session_category const& c = all_settings[i]; session_category const& c = all_settings[i];
settings = e.dict_find_dict(c.name); settings = e.dict_find_dict(c.name);
if (settings) if (!settings) continue;
{ load_struct(*settings, reinterpret_cast<char*>(this) + c.offset, c.map, c.num_entries);
load_struct(*settings, reinterpret_cast<char*>(this) + c.offset, c.map, c.num_entries);
}
} }
#ifndef TORRENT_DISABLE_DHT #ifndef TORRENT_DISABLE_DHT
settings = e.dict_find_dict("dht"); settings = e.dict_find_dict("dht");
@ -808,6 +806,7 @@ namespace aux {
} }
} }
#endif #endif
update_disk_thread_settings();
} }
#ifndef TORRENT_DISABLE_GEO_IP #ifndef TORRENT_DISABLE_GEO_IP
@ -1062,6 +1061,14 @@ namespace aux {
return m_ip_filter; return m_ip_filter;
} }
void session_impl::update_disk_thread_settings()
{
disk_io_job j;
j.buffer = (char*)&m_settings;
j.action = disk_io_job::update_settings;
m_disk_thread.add_job(j);
}
void session_impl::set_settings(session_settings const& s) void session_impl::set_settings(session_settings const& s)
{ {
INVARIANT_CHECK; INVARIANT_CHECK;
@ -1159,12 +1166,7 @@ namespace aux {
if (m_settings.connection_speed < 0) m_settings.connection_speed = 200; if (m_settings.connection_speed < 0) m_settings.connection_speed = 200;
if (update_disk_io_thread) if (update_disk_io_thread)
{ update_disk_thread_settings();
disk_io_job j;
j.buffer = (char*)&m_settings;
j.action = disk_io_job::update_settings;
m_disk_thread.add_job(j);
}
if (m_allowed_upload_slots <= m_settings.num_optimistic_unchoke_slots / 2) if (m_allowed_upload_slots <= m_settings.num_optimistic_unchoke_slots / 2)
{ {