PHP+Memcached - hi-load

craz

Нестандартное звание
у меня все равно есть такое ощущение, что это все спички...


почему такая разница 1.6 и 0.6? ведь по сути объект стирается по-любому после того как отработает из памяти, особенно 1000 объектов... это че попадание в туже область оперативы, с незатертыми данными?
 

AmdY

Пью пиво
Команда форума
craz
сорри, я читер, нужно же под объекты создавать отдельные переменные. и не учёл оверхед по памяти.
PHP:
function foo($a) {
    echo $a;
}

class Says {

    public function foo($a) {
        echo $a;
    }
    public function foo2($a) {
        echo $a;
    }

}

$start = microtime(true);
$memory = xdebug_memory_usage();
for ($i = 0; $i < 100000; $i++) {
    $obj{$i} = new Says();
    $obj{$i}->foo("мегамегаFuck");
}
$timeObject = $start - microtime(true);
$memoryObject = $memory - xdebug_memory_usage();
$start = microtime(true);
$memory = xdebug_memory_usage();
for ($i = 0; $i < 100000; $i++) {
    foo("мегамегаFuck");
}
$timeFunction = $start - microtime(true);
$memoryFunctin = $memory - xdebug_memory_usage();
var_dump($timeObject / $timeFunction);
var_dump($memoryObject / $memoryFunctin);
 

craz

Нестандартное звание
а че эт!!! под объект переменные, тогда и под функцию надо!! вы тут щас мне докажете блин!

)

хаха)

float 1.69722978691 - время)


PHP:
for ($i = 0; $i < 10000; $i++) {
    $func{$i} = foo("мегамегаFuck");
}
float 1.50324375042

float 2.86159518046
вот если так то вот так

а то было в 27000
 

AmdY

Пью пиво
Команда форума
craz
но ты же понимаешь, что это силиконовый тест, он многое не учитывает, чтобы получить точный результат нужно всё умножить на 3 отнять сумму чисел дня твоего рождения, прибавить 2012 и разделить на 42. надеюсь, ничего не упустил.

почитай про zend engine, чтобы понять откуда берётся оверхед. Я в своё время копал, но объяснить грамотно не смогу, т.к. даже си толком не знаю.
 

craz

Нестандартное звание
я уже спросил че вы под оверхидом имеете ввиду?переполнение памяти?
 

Sulik

Новичок
PHP:
class Says2 {
	var $a;

    public function foo() {
        echo $this->a;
    }

}

$start = microtime(true);

for ($i = 0; $i < 10; $i++) {
	$obj{$i} = new Says2();
	$obj{$i}->a = "мегамегаFuck";
	$obj{$i}->foo();
}
А почему тогда так гораздо быстрее?
 

craz

Нестандартное звание
PHP:
class Says2 {
	var $a;

    public function foo() {
        echo $this->a;
    }

}

$start = microtime(true);

for ($i = 0; $i < 10; $i++) {
	$obj{$i} = new Says2();
	$obj{$i}->a = "мегамегаFuck";
	$obj{$i}->foo();
}
А почему тогда так гораздо быстрее?
ну вот зачем ты так со мной???????? они мне и так на предыдущее не ответили(((((((((((((((((((

а теперь я еще и на твой вопрос не буду знать ответ!
 

fisher

накатила суть
craz
Не то. Я хочу оценить так ли критичен тот overhead что создает ООП на пхп для hi-loada. Имхо, я считаю что нет, и пару лишних тазиков не будет стоить столько же сколько время программистов. Конечно это не относиться к проектам маштаба facebook а там имхо стоит уже переходить на компилируемые языки с ООП.
Просто нет такого дискурса "пару лишних тазиков не будет стоить столько же сколько время программистов" в контексте ооп или нет - время в компании большой обычно тратится на другое, и ценности лежат в иной плоскости - надежность, умение быстро что-то выкатить, поправить и тд. Это бизнес-ценности они что ооп что не ооп - один хер, сможешь сделать всё ооп - молодец. Моя практика показываеть, что проще даже не пытаться.

Что же касается вообще сравнения сервера vs программисты, то я уже писал - это заблуждение. У нас долгое время было несколько тысяч серверов и человек 7 пхп-программеров, чтоли.Там стоимость владения всей этой байды выше зарплатного фонда в разы. То есть когда речь идёт о пять серверов или десять, формула работает, а потом есть порог, когда не работает совсем, чем больше компания - тем сильнее не работает.
 

MiksIr

miksir@home:~$
А разве ООП не помогает "умению быстро что-то поправить", особо в случае, когда программист сменился? И так, что бы ничего не отвалилось - хотя бы за счет юнит тестирования, которое без ООП скорее всего превратится в ад.
 

whirlwind

TDD infected, paranoid
MiksIr в твоих проектах часто возникает нефункциональное требование - что бы структура БД не менялась? Вернее даже так, ты можешь для своих проектов изначально разработать такую структуру, которая не потребует изменений? Расскажу по секрету - это один из подходов хайлоада. Вся разница в том, что у них свой ад, а у нас свой.
 

MiksIr

miksir@home:~$
Поясни свою мысль. Не понял, в частности, к чему оно все это сказано и с чего это вдруг один из подходов хайлоада - структура БД неменяемая в веках?
 

tz-lom

Продвинутый новичок
а в чём такие проблемы с скоростью? если вы считаете что у вас тонкое место - ООП то почему бы просто не скомпилировать PHP код , благо классные парни из FB поделились соответсвующим тулчейном,прирост скорости однозначно перекроет потери производительности,и почему тогда надо отказываться от ООП?

и в догонку вопрос,допустим вы имеете большой сложный алгоритм по работе с достаточно большим количеством полей в рамках одной структуры
вы уверены что если реализовать его в функциональном стиле получится быстрее? (предположим что с интерфейсом проблем нет а код настолько фундаментален и вылизан что главное чтобы он работал - далее вся его "некрасивость" и "неподдерживаемость" будет неактуальна)
 

HraKK

Мудак
Команда форума
Нашел хайлоад написанный на кохане. Вопрос снимается.
 

kvn

programmer
Привет уважаемые.

Давно не заглядывал, все в делах.
Итак по порядку вопросы к знающим:

1. основной вопрос: по каким критериям определять, что мемкеш-ноде уже хватит, и нужно вводить еще одну?

Мысли:
Used 8.0 GBytes
Total 8.0 GBytes
Wasted 1000.4 MBytes

Не нашел толкового рассказа, что такое Wasted, и как оно работает..:(

Далее:
STAT limit_maxbytes 8589934592
STAT bytes 7512504360

STAT curr_items 3162673
STAT total_items 62955796
STAT evictions 283636
STAT reclaimed 7543436

2. На сколько я понимаю, то memcache из памяти ничего сам не удаляет, а удаляет только если итем прослоченый, и нужно место для новых SET-ов.
Так появляются evictions.
2.1. Но они на сколько я понял могут появляться из-за распределения слабов, т.е. даже при наличии свободной памяти, но если заняты все слабы подходящего размера, то выпадения из кеша будут только по этим слабам.
Хотя может уже добавили динамическую перестройку слабов?

3. Если ключик валялся в экспайр, но не выпал, и устанавливается клиентом заново, то аля reuse, то так появляются reclaimed.

Все что выше - это мысли, понимание, но не факт что верное.
Если ошибаюсь, поправьте пожалуйста.

Ну и собстно основной вопрос, - по каким критериям определять, что нода уже переполнена?, ведь то, что занята вся память это не означает, что она кончилась, там могут быть давно неактуальные итемы, и мемкеш их просто еще не удалил..

Спасибо

P.S. И еще: пользуется ли кто-то Katama-алгоритмом по рапрседелению ключей по серверам, и какой хеш-алгоритм предпочтительнее?
md5|sha1|tiger|crc|fnv1_32|fnv1_64|fnv1a_32|fnv1a_64|murmur|oneatatime ?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
1. Wasted это «бесполезное место» - это то сумма обрезков, оставшихся в слабах, каждый из которых слишком маленький для размещения элемента.
2. Eviction это как раз выталкивание самого старого НЕпросроченного элемента для SET когда места нету.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
reclaim - это хорошо, да. По поводу большого wasted-а нужно смотреть размер слаба, но как говорят, что иногда (особенно если данные сильно варьируются по размеру) высокий размер wasted-а неизбежен.
 

kvn

programmer
1. Wasted это «бесполезное место» - это то сумма обрезков, оставшихся в слабах, каждый из которых слишком маленький для размещения элемента.
2. Eviction это как раз выталкивание самого старого НЕпросроченного элемента для SET когда места нету.
1. Спасибо. Понятно!
2. Т.е. когда появляются Evictions, то пора расширять кластер мемкешей?

Я про evictions здесь прочитал достаточно досупно:
http://groups.google.com/group/memcached/browse_thread/thread/0ee24dcb981b434a

Bytes is much lessser than limit_maxbytes.
I dont understand why the evictions are happening even though there is
space left.


Each slab is 1mb and its designated to hold items of particualr size.
So if you had 5000 items over 500KB inserted into the cache at some
time ( at the beginning ) they would consume 5GB (they would take 1MB
each even if they were 501KB).

So after some time caching patterns change and you dont insert big
items any more. This 5GB is wasted if you are not using such big items
any more. So distribution changes and big items are not needed any
more but more smaller items cant fit into the cache as memcached cant
put small items into slabs designated for big items.
 
Сверху