The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Для Debian GNU/Linux представлены пакеты Linux ядра, ориенти..."
Отправлено fidaj, 02-Окт-09 20:34 
>[оверквотинг удален]
>- at vfs_cache_pressure=100 there is no change in behaviour.
>- at vfs_cache_pressure > 100 we reclaim dentries and inodes harder.
>
>Как я понял (если не так поправьте) увеличение параметра способствует сокращению кешей
>(dentries and inodes).
>Про то, что оно указывается в процентах от ОЗУ нигде не встречал.
>
>Думаю если уменьшить тягу к увеличению кеша, то все уместиться в ОЗУ,
>и не будет так медлить при работе. Вот и интересуюсь как
>это сделать.

Вот кстати те участки кода где задействовано vfs_cache_pressure:
../fs/inode.c

/*
* shrink_icache_memory() will attempt to reclaim some unused inodes.  Here,
* "unused" means that no dentries are referring to the inodes: the files are
* not open and the dcache references to those inodes have already been
* reclaimed.
*
* This function is passed the number of inodes to scan, and it returns the
* total number of remaining possibly-reclaimable inodes.
*/
static int shrink_icache_memory(int nr, gfp_t gfp_mask)
{
        if (nr) {
                /*
                 * Nasty deadlock avoidance.  We may hold various FS locks,
                 * and we don't want to recurse into the FS that called us
                 * in clear_inode() and friends..
                 */
                if (!(gfp_mask & __GFP_FS))
                        return -1;
                prune_icache(nr);
        }
        return (inodes_stat.nr_unused / 100) * sysctl_vfs_cache_pressure;
}

../fs/dcache.c

/*
* Scan `nr' dentries and return the number which remain.
*
* We need to avoid reentering the filesystem if the caller is performing a
* GFP_NOFS allocation attempt.  One example deadlock is:
*
* ext2_new_block->getblk->GFP->shrink_dcache_memory->prune_dcache->
* prune_one_dentry->dput->dentry_iput->iput->inode->i_sb->s_op->put_inode->
* ext2_discard_prealloc->ext2_free_blocks->lock_super->DEADLOCK.
*
* In this case we return -1 to tell the caller that we baled.
*/
static int shrink_dcache_memory(int nr, gfp_t gfp_mask)
{
        if (nr) {
                if (!(gfp_mask & __GFP_FS))
                        return -1;
                prune_dcache(nr);
        }
        return (dentry_stat.nr_unused / 100) * sysctl_vfs_cache_pressure;
}

../fs/mbcache.c

/*
* mb_cache_shrink_fn()  memory pressure callback
*
* This function is called by the kernel memory management when memory
* gets low.
*
* @nr_to_scan: Number of objects to scan
* @gfp_mask: (ignored)
*
* Returns the number of objects which are present in the cache.
*/
static int
mb_cache_shrink_fn(int nr_to_scan, gfp_t gfp_mask)
{
        LIST_HEAD(free_list);
        struct list_head *l, *ltmp;
        int count = 0;

        spin_lock(&mb_cache_spinlock);
        list_for_each(l, &mb_cache_list) {
                struct mb_cache *cache =
                        list_entry(l, struct mb_cache, c_cache_list);
                mb_debug("cache %s (%d)", cache->c_name,
                          atomic_read(&cache->c_entry_count));
                count += atomic_read(&cache->c_entry_count);
        }
        mb_debug("trying to free %d entries", nr_to_scan);
        if (nr_to_scan == 0) {
                spin_unlock(&mb_cache_spinlock);
                goto out;
        }
        while (nr_to_scan-- && !list_empty(&mb_cache_lru_list)) {
                struct mb_cache_entry *ce =
                        list_entry(mb_cache_lru_list.next,
                                   struct mb_cache_entry, e_lru_list);
                list_move_tail(&ce->e_lru_list, &free_list);
                __mb_cache_entry_unhash(ce);
        }
        spin_unlock(&mb_cache_spinlock);
        list_for_each_safe(l, ltmp, &free_list) {
                __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry,
                                                   e_lru_list), gfp_mask);
        }
out:
        return (count / 100) * sysctl_vfs_cache_pressure;
}

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру