Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> memcached на файлах, интересное тестовое задание 
:(
    Опции темы
webtech
  Дата 30.11.2009, 03:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.11.2009

Репутация: нет
Всего: нет



Приветствую !

Обращаюсь с просьбой помочь. Я устраиваюсь на новую работу. А там тестовое задание. 

Сразу разделяю Ваше негодование. Тестовое - значит сам должен сделать. Но я ни в коем случае не прошу его за меня решать или что-либо подобное.

Просто не могу просечь "фишку" задания.  То есть что же хочет проверить работодатель. Может хотят увидеть развитую систему классов ? А может грамотную алгоритмизацию ? А может еще что ? Надеюсь кто-то из более опытных людей сможет что-либо подсказать.

Вот, собственно, и само задание:

Цитата

Напишитe клаcc (клaccы) нa php, рeaлизующий мeхaнизм хрaнeния дaнных в cтилe memcached, пригoдный для иcпoльзoвaния нa выcoкoнaгружeнных прoeктaх. Ключ, для прocтoты, цeлoчислeнный. Кoличecтвo хрaнимых зaписeй, миллиoны штук. Рeaлизуйтe хрaнeниe дaнных в фaйлoвoй систeмe. Рeaлизуйтe хрaнeниe дaнных в sql бaзe. Рeaлизуйтe мeхaнизм oчистки кeшa от уcтaрeвших зaпиceй. Тoчнocть уcтaрeвaния 1 чаc.


Самая большая сложноcть: как это сделать в файловой системе. memcached - это по сути дела большая распределенная хэш-табличка. Где есть 2 основных метода: get(key) и set(key, value). В случае файлов, у меня всё утыкается в изменение/удаление данных. Допустим мы создали три записи:

set('key1', '1000');
set('key2', '1000');
set('key3', '1000');

Это все хранится в файле. Допустим теперь нам надо изменить значение для ключа 'key2' и новое значение будет длиннее старого. Например сделать:

set('key2', '99999999');

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

По сути дела тут единственный выход - взять из файла всё, что находится до 'key2', скопировать в tmp-файл, дописать в него новое значение 'key2', затем дописать остаток из исходного файла и заменить исходный файл. Ну и стереть tmp-файл. 

Только с учетом объемов ("миллионы штук"), у нас могут появиться довольно-таки здоровенные файлы в несколько сотен метров, с которыми будут проблемы. Не думаю, что разумно двигать сотни мегабайт, ради того, чтобы вставить лишние сто килобайт в середину файла. Это не хорошо с точки зрения производительности. Или я ошибаюсь ? 

Кроме того, если у нас под кеш выделен допустим 1 гиг. Мы его забили на 1000 метров. Теперь нам надо в эти 1000 метров запихать 100КБ куда-нибудь в середину. Как мы создадим tmp-файл на 1000 метров ? 1000+1000 = 2000, а это уже явно больше выделенного 1 гигабайта.

С удалением та же беда. Нельзя же просто выкинуть кусок из файла. Опять таки придется пересохранять.

Вариант "создавать по 1 файлу на каждое значение кеша" - тоже не вариант. Несколько миллионов файлов ради кеша - явно не дело.

Если считать, что я тут нигде не ошибся и все верно. Тогда по заданию вообще придется писать что-то вроде своего file-based DB-engine (типа sqlite). С грамотным разделением записей по файлам и всевозможными оптимизациями. Но это ж как-то слишком мастабно. Может я слишком сильно заморачиваюсь ?

Спасибо за то, что дочитали до конца и за любую помощь.
PM MAIL   Вверх
Simpliest
Дата 30.11.2009, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(webtech @  30.11.2009,  02:20 Найти цитируемый пост)
то мы не можем просто "раздвинуть" границы для хранения нового значения. Или я ошибаюсь ?

Вы таки ошибаетесь. 

Я конечно понимаю что кушать хочется всем... 
Но почему бы эти вопросы не задать работодателю? smile (если уж не хотите посмотреть мануал)
Если им требуется "специфичный" специалист, то даже "обойдя" с помощью форума тестовое задание в процессе работы станет вполне очевидно что вы не подходите им. И вас уволят. Зачем доводить до конфликта?

Вполне вероятно что просто проверяют ваш уровень, ваш стиль мышления. Да, ошибки могут повлиять на ЗП, но если вы им подходите - вас всеравно возьмут, даже если вы допустите ошибки.

Просто поймите  - это не диктант в школе smile

P.S. Безотносительно возможности "раздвигать" содержимое файла smile
Я бы каждый ключ(или некоторую небольшую группу ключей) хранил в своем файле. Это проще в реализации.

Цитата(webtech @  30.11.2009,  02:20 Найти цитируемый пост)
Несколько миллионов файлов ради кеша - явно не дело

Открою секрет. У меня без всякого кеша 350к файлов на почти голой домашней машине.

Для хайлоада хранить кеш в файлах - глупо. Поэтому заморачиваться о миллионах - не стоит.


--------------------
user posted image
PM   Вверх
webtech
Дата 30.11.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.11.2009

Репутация: нет
Всего: нет



Simpliest, спасибо за такой развернутый ответ.

Цитата(Simpliest @ 30.11.2009,  08:23)
Вы таки ошибаетесь. 
 Если можно - чуть конкретнее, что вы тут подразумеваете. Есть способы просто "раздвинуть" файл ? Без таскания кусков ?

Цитата(Simpliest @ 30.11.2009,  08:23)

Я конечно понимаю что кушать хочется всем... 
Но почему бы эти вопросы не задать работодателю? smile (если уж не хотите посмотреть мануал)
 Подозреваю что ответ работодателя будет: "делайте как понимаете". Про мануал: много чего уже перечитал, и по теме memcached и по файловым системам. Вы какой мануал имеете ввиду ?

Цитата(Simpliest @ 30.11.2009,  08:23)

Если им требуется "специфичный" специалист, то даже "обойдя" с помощью форума тестовое задание в процессе работы станет вполне очевидно что вы не подходите им. И вас уволят. Зачем доводить до конфликта?

Вот точно чего не хочется - это "обходить" тестовое задание и потом вылетать с должности с конфликтом и по незнанию. Просто стараюсь найти верное направление.

Цитата(Simpliest @ 30.11.2009,  08:23)

Вполне вероятно что просто проверяют ваш уровень, ваш стиль мышления. Да, ошибки могут повлиять на ЗП, но если вы им подходите - вас всеравно возьмут, даже если вы допустите ошибки.

Просто поймите  - это не диктант в школе smile

Очень надеюсь на такое адекватное отношение =) Но как предугадать кто будет проверять задание и какой у него подход  smile 

Цитата(Simpliest @ 30.11.2009,  08:23)

P.S. Безотносительно возможности "раздвигать" содержимое файла smile
Я бы каждый ключ(или некоторую небольшую группу ключей) хранил в своем файле. Это проще в реализации.
 
Безусловно проще. Вообще уже несколько голосов именно за такой подход. Просто пока не хватало опыта это понять. Нужен был свежий незамыленный взгляд со стороны =)

Цитата(Simpliest @ 30.11.2009,  08:23)
Открою секрет. У меня без всякого кеша 350к файлов на почти голой домашней машине.

350k не 100 млн.

Цитата(Simpliest @ 30.11.2009,  08:23)
Для хайлоада хранить кеш в файлах - глупо. Поэтому заморачиваться о миллионах - не стоит.

А что поделаешь, если в задании "Кoличecтвo хрaнимых зaписeй, миллиoны штук." и механизм "пригoдный для иcпoльзoвaния нa выcoкoнaгружeнных прoeктaх".
PM MAIL   Вверх
Simpliest
Дата 30.11.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(webtech @  30.11.2009,  12:03 Найти цитируемый пост)
Есть способы просто "раздвинуть" файл ? Без таскания кусков ?

Просто раздвинуть нельзя. Придется перезаписывать ВЕСЬ файл в любом случае.

И таскать ничего не надо. Можно занятся геморроем и устроить постраничное выделение памяти, индексный файл и т.д. и т.п. Мое мнение - в топку.

Файл должен быть небольшим, читаем файл целиком 
$data = file()
меняем/добавляем/удаляем - и перезаписываем файл.
поэтому в таком случае мы можем вставлять строки произвольного размера

Миллионы файлов тянут максимум на намек об ограничениях числа файлов в одном каталоге. 
Поэтому нужно просто предусмотреть 3 уровня вложенности для самих файлов
Даже при ограничении в всего 2000 файлов на каталог мы будем иметь максимальную емкость 36^3 * 2000 = 93млн
ключ 5e8ff9bf55ba3508199d22e984129be6
будет хранится в
/5/e/8/ff9bf55ba3508199d22e984129be6

Цитата(webtech @  30.11.2009,  12:03 Найти цитируемый пост)
механизм "пригoдный для иcпoльзoвaния нa выcoкoнaгружeнных прoeктaх". 

Сдается мне что относится это не к методике хранения.
А к самой работе. Т.е. нужен демон что ли. Или я опять все усложняю и твой работодатель просто путает memcache и memcachedb
Хм. Хотя быть может просто не знает о key-value хранилищах...

Добавлено через 48 секунд
Фу, короче, ты меня запутал. Проще всего уточнить у работодателя, чем гадать на кофейной гуще. Слишком много вариантов.


--------------------
user posted image
PM   Вверх
webtech
Дата 30.11.2009, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.11.2009

Репутация: нет
Всего: нет



Simpliest, спасибо, что тоже заморочился над проблемой  smile  Что-то для себя я почерпнул.
PM MAIL   Вверх
sTa1kEr
Дата 2.12.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Самый простой (а самый простой часто и самый эффективный) способ - это использовать для одного значения один файл. Тогда имя файла будет MD5 от ключа, а дата размещения значения в хранилище будет датой модификации файла. Таким образом у нас не будет никаких издержек на хранение мета информации и индексов (в этой схеме они просто не нужны), максимальная эффективность при работе с файловой системой (всегда будет читаться и писаться только то что необходимо, ни байта более), а так же можно будет совершенно не заботится о структуре данных (просто писать в файл все как есть)

Структура директорий должна быть такой, как привел Simpliest, т.е. несколько уровней (не обязательно 3, можно и больше, но для миллиона записей хватит и 3х) основанных на MD5 ключа. При получении значения, по ключу будет определятся полный путь к файлу, а затем проверяться на его актуальность. Если mtime файла + 1 час меньше текущего времени, то удаляем файл и возвращаем null (можно так же по крону раз в несколько часов удалять "протухшие" файлы, в *nix это можно сделать одной командой)

Что-же касается highload проектов.  При наличии N-ого количества шустрых винтов, подмонтированных в различные директории хранилища, и достаточного количества оперативной памяти на сервере - данная схема будет даже быстрее memcache. Т.ч. работодатель вас не обманул, такой механизм еще как может быть пригоден на высоконагруженных проектах  smile 

PS Вы случайно не к нам устраиваетесь на работу? smile 

UPD. Что бы не было недопониманий в будущем. Я ни в коем случае не утверждаю, что файловый кеш - замена кешу в памяти. Основная мысль в том, что файловое кеширование совсем не такое медленное, как думают многие (а при определенных условиях оно может быть даже быстрее memcache (см. тест ниже)), плюс оно предельно простое и стабильное, а значит более чем применимо в highload. 

Это сообщение отредактировал(а) sTa1kEr - 4.12.2009, 11:25
PM MAIL   Вверх
Simpliest
Дата 3.12.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(sTa1kEr @  2.12.2009,  21:43 Найти цитируемый пост)
При наличии N-ого количества шустрых винтов, подмонтированных в различные директории хранилища, и достаточного количества оперативной памяти на сервере 

Я может что-то путаю. Но RAM быстрее чем чтение с диска. Memcache хранит все в памяти.

Каким образом N-e количество шустрых винтов обгонят RAM?

Добавлено через 3 минуты и 48 секунд
Цитата(sTa1kEr @  2.12.2009,  21:43 Найти цитируемый пост)
это использовать для одного значения один файл

Есть нюанс - возможно есть смысл хранить данные все же небольшими блоками.

Часто бывает требуются подряд несколько значений и пакетное чтение несколько ускорит работу.


--------------------
user posted image
PM   Вверх
skyboy
Дата 3.12.2009, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 1
Всего: 260



Цитата(Simpliest @  3.12.2009,  12:09 Найти цитируемый пост)
Memcache хранит все в памяти.

в swap'e?
PM MAIL   Вверх
Simpliest
Дата 3.12.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(skyboy @  3.12.2009,  13:00 Найти цитируемый пост)
в swap'e? 

В каком свапе? В свап оно не должно попадать ни в коем случае иначе толку от него будет ноль целых шиш десятых.

Добавлено через 2 минуты и 50 секунд
Я так понял посыл  sTa1kEr, что 100Gb RAM выделенные под memcache будут медленее, чем скажем 4x20Gb SAS HDD + 20GB RAM


--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 3.12.2009, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Simpliest @  3.12.2009,  13:09 Найти цитируемый пост)
Каким образом N-e количество шустрых винтов обгонят RAM?

Цитата(Simpliest @  3.12.2009,  14:22 Найти цитируемый пост)
Я так понял посыл  sTa1kEr, что 100Gb RAM выделенные под memcache будут медленее, чем скажем 4x20Gb SAS HDD + 20GB RAM 

Нет, я не имел ввиду SAS. Собственно жесткие диски тут большой роли не играют, основная суть в другом.

Цитата(Simpliest @  3.12.2009,  13:09 Найти цитируемый пост)
Я может что-то путаю. Но RAM быстрее чем чтение с диска. Memcache хранит все в памяти.

Конечно же RAM быстрее, чем чтение с диска. Однако при достаточном количестве оперативной памяти на сервере все эти данные лягут в дисковый кеш и будут отдаваться так же из RAM, только в отличии от memcache не нужно будет устанавливать дорогое TCP соединение и гонять данные по сети.

Собственно можешь провести простой тестик:
Код

<?php // t1.php

// file_put_contents('test.txt', '1234567890'); // надо положить в кеш перед запуском
echo file_get_contents('test.txt');

Код

<?php // t2.php

$memcache = new Memcache();
$memcache->connect('192.168.0.5', 11211);
// $memcache->set('test', '1234567890', null, 3600); // надо положить в кеш перед запуском
echo $memcache->get('test');

Код

$ ab -n 1000 -c 10 http://test.local/t1.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>                          
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/        
Licensed to The Apache Software Foundation, http://www.apache.org/              

Benchmarking test.local (be patient)
Completed 100 requests              
Completed 200 requests              
Completed 300 requests              
Completed 400 requests              
Completed 500 requests              
Completed 600 requests              
Completed 700 requests              
Completed 800 requests              
Completed 900 requests              
Completed 1000 requests             
Finished 1000 requests              


Server Software:        nginx/0.8.17
Server Hostname:        test.local  
Server Port:            80          

Document Path:          /t1.php
Document Length:        10 bytes

Concurrency Level:      10
Time taken for tests:   0.916 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      169000 bytes
HTML transferred:       10000 bytes
Requests per second:    1092.20 [#/sec] (mean)
Time per request:       9.156 [ms] (mean)
Time per request:       0.916 [ms] (mean, across all concurrent requests)
Transfer rate:          180.26 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       3
Processing:     1    9   4.7      9      34
Waiting:        1    9   4.7      9      34
Total:          1    9   4.6      9      34

Percentage of the requests served within a certain time (ms)
  50%      9
  66%     10
  75%     10
  80%     10
  90%     12
  95%     18
  98%     29
  99%     31
 100%     34 (longest request)

$ ab -n 1000 -c 10 http://test.local/t2.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>                          
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/        
Licensed to The Apache Software Foundation, http://www.apache.org/              

Benchmarking test.local (be patient)
Completed 100 requests              
Completed 200 requests              
Completed 300 requests              
Completed 400 requests              
Completed 500 requests              
Completed 600 requests              
Completed 700 requests              
Completed 800 requests              
Completed 900 requests              
Completed 1000 requests             
Finished 1000 requests              


Server Software:        nginx/0.8.17
Server Hostname:        test.local  
Server Port:            80          

Document Path:          /t2.php
Document Length:        10 bytes

Concurrency Level:      10
Time taken for tests:   4.311 seconds
Complete requests:      1000         
Failed requests:        10           
   (Connect: 0, Receive: 0, Length: 10, Exceptions: 0)
Write errors:           0                             
Total transferred:      209260 bytes                  
HTML transferred:       50260 bytes                   
Requests per second:    231.99 [#/sec] (mean)         
Time per request:       43.105 [ms] (mean)            
Time per request:       4.311 [ms] (mean, across all concurrent requests)
Transfer rate:          47.41 [Kbytes/sec] received                      

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     8   39 102.1     25    1033
Waiting:        8   39 102.0     24    1032
Total:          8   39 102.1     25    1033

Percentage of the requests served within a certain time (ms)
  50%     25                                                
  66%     27                                                
  75%     30                                                
  80%     31                                                
  90%     38                                                
  95%     44                                                
  98%    229                                                
  99%   1011                                                
 100%   1033 (longest request)                              


Добавлено через 3 минуты и 22 секунды
Цитата(Simpliest @  3.12.2009,  14:09 Найти цитируемый пост)

Есть нюанс - возможно есть смысл хранить данные все же небольшими блоками.

Часто бывает требуются подряд несколько значений и пакетное чтение несколько ускорит работу. 

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

Добавлено через 7 минут и 39 секунд
Только сейчас заметил, что во втором тесте 10 запросов не прошло... Ну да это не должно сильно влиять на результаты.
Вероятно просто в memcache был достигнут лимит коннектов (что, кстати, в случае с чтением из файла полностью исключено)
PM MAIL   Вверх
sTa1kEr
Дата 3.12.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



В тетсте с memcache настолько ужасные результаты из-за того, что сеть не слишком шустрая у меня... На продакшене, конечно-же, разница будет значительно меньше. 

Попробовал поднять memcache на locаlhost
Код

$ ab -n 1000 -c 10 http://test.local/t2.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>                          
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/        
Licensed to The Apache Software Foundation, http://www.apache.org/              

Benchmarking test.local (be patient)
Completed 100 requests              
Completed 200 requests              
Completed 300 requests              
Completed 400 requests              
Completed 500 requests              
Completed 600 requests              
Completed 700 requests              
Completed 800 requests              
Completed 900 requests              
Completed 1000 requests             
Finished 1000 requests              


Server Software:        nginx/0.8.17
Server Hostname:        test.local  
Server Port:            80          

Document Path:          /t2.php
Document Length:        0 bytes

Concurrency Level:      10
Time taken for tests:   1.019 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      159000 bytes
HTML transferred:       0 bytes
Requests per second:    981.19 [#/sec] (mean)
Time per request:       10.192 [ms] (mean)
Time per request:       1.019 [ms] (mean, across all concurrent requests)
Transfer rate:          152.35 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       1
Processing:     3   10   3.9      9      38
Waiting:        3   10   3.8      9      38
Total:          3   10   3.9      9      38

Percentage of the requests served within a certain time (ms)
  50%      9
  66%     11
  75%     12
  80%     12
  90%     15
  95%     17
  98%     22
  99%     25
 100%     38 (longest request)


Теперь результаты практически идентичны, но на продакшене обычно не бывает, что бы memcahce висел на www серверах - это бессмысленно. 
PM MAIL   Вверх
Simpliest
Дата 3.12.2009, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Цитата(sTa1kEr @  3.12.2009,  15:30 Найти цитируемый пост)
Однако при достаточном количестве оперативной памяти на сервере все эти данные лягут в дисковый кеш и будут отдаваться так же из RAM, только в отличии от memcache не нужно будет устанавливать дорогое TCP соединение и гонять данные по сети

Тю.

Во-первых, насколько я знаю, loopback быстрее, чем коннект к удаленному серверу. Что собственно и показали твои тесты.

Во-вторых, ты и сам сказал
Цитата(sTa1kEr @  3.12.2009,  15:47 Найти цитируемый пост)
но на продакшене обычно не бывает, что бы memcahce висел на www серверах - это бессмысленно.  

И, насколько я знаю, это делается по причине наличия фермы с единым кешем.

Кеш на файлах - будет работать только для одного сервера. Который будет заведомо медленнее фермы из таких же серверов.

И еще меня смущает вот это
Цитата(sTa1kEr @  3.12.2009,  15:30 Найти цитируемый пост)
Однако при достаточном количестве оперативной памяти на сервере все эти данные лягут в дисковый кеш

Я не настолько хорошо знаком с *nix, поэтому не могу сказать есть ли какие-то ограничения памяти под дисковый кеш.

P.S. Если речь идет об одной машине, вместо memcache можно попробовать задействовать apc/eaccelerator
они вроде имеют базовый функционал для key-value хранилища.


--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 3.12.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Simpliest @  3.12.2009,  18:50 Найти цитируемый пост)
Во-первых, насколько я знаю, loopback быстрее, чем коннект к удаленному серверу. Что собственно и показали твои тесты.

Вся соль мемкеша в распределенном доступе к его хранилищу, на localhost'е его держать большого смысла нету. На localhost'е даже eaccelerator не нужен, можно просто тупо все в shared memory на прямую пихать

Цитата(Simpliest @  3.12.2009,  18:50 Найти цитируемый пост)

И, насколько я знаю, это делается по причине наличия фермы с единым кешем.

Кеш на файлах - будет работать только для одного сервера. Который будет заведомо медленнее фермы из таких же серверов.

Я не говорил, что этот способ будет в любом случае быстрее любых других возможных способов. Я лишь сказал, что при определенных условиях он будет быстрее мемкеша. Это раз.
Речь шла про то, что данный механизм кеширования применим на highload проектах, именно это я и пытался показать. Это два.

Цитата(Simpliest @  3.12.2009,  18:50 Найти цитируемый пост)
P.S. Если речь идет об одной машине, вместо memcache можно попробовать задействовать apc/eaccelerator
они вроде имеют базовый функционал для key-value хранилища. 

Да можно все что угодно, но у ТС в задании речь про файловое хранилище и его применение в высоконагруженных проектах.

Добавлено @ 18:09
Цитата(Simpliest @  3.12.2009,  18:50 Найти цитируемый пост)
Я не настолько хорошо знаком с *nix, поэтому не могу сказать есть ли какие-то ограничения памяти под дисковый кеш.

Я полагаю, что есть, но в *nix практически все настраиваемо. 

Это сообщение отредактировал(а) sTa1kEr - 3.12.2009, 18:10
PM MAIL   Вверх
Simpliest
Дата 3.12.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Вот, а Баба-Яга всеравно против smile

Если памяти достаточно, то как справедливо ты заметил почему не использовать shared memory?
Зачем эти танцы с бубном в виде файлового кеша?

А если памяти недостаточно... то скорость оного(файлового хранилища) будет не такой радужной.

Или я что-то не понимаю? smile


--------------------
user posted image
PM   Вверх
sTa1kEr
Дата 3.12.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 11
Всего: 146



Цитата(Simpliest @  3.12.2009,  19:45 Найти цитируемый пост)
Если памяти достаточно, то как справедливо ты заметил почему не использовать shared memory?
Зачем эти танцы с бубном в виде файлового кеша?

Как раз с shared memory будут танцы с бубном (нужно выделять сегменты, следить что бы данные поместились в сегмент, etc. кроме того лимит на shared memory жестко ограничен настройками ядра), а файловый кеш прост, как два пальца ... smile  fread(id), fwrite(id, val), filemtime(id) - вот и вся любовь smile 

Ты думаешь почему PHP  сессии по дефолту в файлах хранит (кстати, с точно такой же многоуровневой структурой директорий и точно так так же с ключем в качестве имени файла), а не в shared memory или еще каком-нить хитром хранилище?

По твоему nginx предназначен для высоконагруженных проектов? А как ты думаешь какой способом кеширования fcgi он использует для достижения производительности 50000 запросов в секунду? smile 
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.