• Раздача статического контента — счет на милисекунды
    0
    Когда речь идет о малом количестве файлов и папок, то разницы не будет. Но когда файлов очень много и винт не быстрый, т.е. есть ощутимый iowait то загрузка в ОЗУ может помочь.

    Простой эксперимент:
    Берем папку 100 000 файлов, для того чтоб ее сгенерить используем скрипт, например такой:
    #!/bin/bash
    
    # Init variables
    EXAMPLEFILE=./example.png
    FILESCOUNT=100000
    CACHE_DIR=/home/cache
    URL="http://imagerequests"
    
    for i in `seq 0 $FILESCOUNT`; do
        let "X = i % 100"
        let "D = i - X"
        let "L1 = D/100"
    
        let "X = i % 1000"
        let "D = i - X"
        let "L2 = D/1000"
    
        TARGET_DIR=$CACHE_DIR/$L2/$L1
    ....
        if [ ! -d $TARGET_DIR ]; then
           mkdir -p $TARGET_DIR
        fi
        if [ ! -f $TARGET_DIR/$i.png ]; then
           cp $EXAMPLEFILE $TARGET_DIR/$i.png
        fi
        echo "$URL/$L2/$L1/$i.png"
    done
    


    При этом на стандартном выводе формируется список URL-ов, кладем его в /etc/siedge/urls.txt.

    У меня вся папка получилась окло 70M, полный размер на FS около 400M

    Примонтировал так
    mount -t tmpfs -o size=1G,noatime,async tmpfs /home/ram
    


    Запускаем sedge:
    siege -c 1000 -t 10s -i -b
    


    Для диска
    Transactions: 52106 hits
    Availability: 100.00 %
    Elapsed time: 9.40 secs
    Data transferred: 38.69 MB
    Response time: 0.02 secs
    Transaction rate: 5543.19 trans/sec
    Throughput: 4.12 MB/sec
    Concurrency: 134.60
    Successful transactions: 52341
    Failed transactions: 0
    Longest transaction: 2.10
    Shortest transaction: 0.00


    Для RAM:
    Transactions: 102892 hits
    Availability: 100.00 %
    Elapsed time: 9.04 secs
    Data transferred: 76.22 MB
    Response time: 0.00 secs
    Transaction rate: 11381.86 trans/sec
    Throughput: 8.43 MB/sec
    Concurrency: 15.30
    Successful transactions: 103132
    Failed transactions: 0
    Longest transaction: 0.32
    Shortest transaction: 0.00


    Понятно, что когда все файлы загрузятся в RAM из fs то время сравниться. Ну а если файлов будет пару миллионов, то с файловой системы все может и не взлететь, а рам задосить невозможно.

    В статье сделаю правки, чтоб было понятно в каких случаях, так можно делать.
  • Раздача статического контента — счет на милисекунды
    0
    Понятно, что стоимость потребительских SSD ниже, как и их скорость, тоже ниже, однако со стороны бизнеса должны быть требования по скорости загрузки файлов и т.п., действительно ли они не выполнялись на 8xINTEL SSDSC2BB480G4 480G

    Не выполнялись, по нескольким причинам:
    1. Это старый сервер, который постепенно апгрейдили, на разных этапах пробовали разные конфигурации. Вначале было 4 SSD в stripped raid без RAID-контроллера. Это работает плохо, так как RAID-контроллер с батарейкой это снижение рисков развала RAID-масива (с такой проблемой столнулись).
    2. Потом собрали то что есть но пожалели денег на быстрий RAID-контроллер и, возможно, небольшие iops-ы отчасти и его рук дело.
    3. Нету аппаратного шифрования, это тоже проблема, держать прожорливые процы только чтоб шифровать трафик — неоптимально и если дать на них большую нагрузку то и процы начнут тормозить и iowait поползет вверх. (Процессоры можно озадачить более полезной нагрузкой, например, предпорезкой разных форматов фоток)
    4. Возможно можно было бы компенсировать добавлением RAM-а, так там уже нету свободных слотов.
    5. Есть еще одна неприятная особенность, система начинает тормозить не линейно, например нагрузка возросла на 5% а скорость отдачи снизилась на 50% (я кончно, утрирую, но суть, я надеюсь, понятна)
    6. На сервере всегда должен быть резерв, на случай выхода из строя друго-го кеш-сервера.
    Или выполнялись, но было бабло? :)

    Очень быстро никогда не бывает, если у Вас iowai не 0 значит диск иногда тормозит.

    Я бы еще вспомнил что контроллер ARC-1882 сам по себе является узким местом, он малопроизводительный для такой конфигурации, превращает в ssd с 100к iops каждая в RAID с масксимум 60к iops всего, да и латенси его довольно велик. Еще бы через адаптек 6805 ssd подключили.

    Да тут спору нет, почему ставили Araca я уже писал, просто NVMe дискам не нужен RAID-контроллер и это прекрасно!
  • Раздача статического контента — счет на милисекунды
    0
    Там javascript тормозил :)
  • Чем бизнесу и пользователям грозит борьба РКН и Telegram? Мнения экспертов
    +1
    Telegram это островок свободы, неподконтрольный спец. службам. Посмотите в какое посмешище превлатилась эта кампания по блокировке всеми любимого месенджера. Мне кажется, сила каждого пользоваться telegram заключается в том, чтоб научиться пользоваться тем что Вам нравиться несмотря на чужое желание Вас ограничить.
  • Node.js и переход с PHP на JavaScript
    +1
    Вы сами то пример смотрели? Вечный цикл в котором инициируются «асинхронные» запросы и тут же постоянно идет проверка синхронным кодом или они все выполнились. Тут нету самого главного, события о том что что-то произошло. Надо постоянно синхронно что-то опрашивать. Конечно же это лучше чем ничего, но до полноценной асинхронной модели программирования еще очень далеко.
    Это все равно что на машине кузов мерседеса с двигателем от таврии.
  • Node.js и переход с PHP на JavaScript
    +2
    Вы уверены, что на php нельзя сделать асинхронный запрос к базе / кэшу? нельзя сделать банальный http-запрос (либо каким либо еще протоколом, благо сокеты доступны и для всего более менее стандартного есть реализации) и не дожидаться его исполнения?

    Напришите пример кода на PHP ассинхронного запроса к MySQL
  • Node.js и переход с PHP на JavaScript
    –2
    mysql_pconnect убыстряет установку соединения, но корень проблемы не в этом, а в том, что на каждое обращение к скрипту нужен отдельный конекшн. И когда соединений с сервером много база начинает «тупить», что еще провоцирует открытие еще большего числа одновременных соединений с базой.
  • Node.js и переход с PHP на JavaScript
    +6
    Суммарное время будет равняться… суммарному последовательному времени. Он же однопоточный. Разве нет?

    Конечно же нет. Инициировать запросы нода, в так называемом event loop будет последовательно, но далее будет ждать события «пришел ответ» и запускать обработчик на это событие.
    Redis тоже однопоточный, как вы считаете с редисом можно работать паралельно?

    А вообще интересно было бы привести реальную задачу, которую вы решили таким способом. Вот правда, ни разу еще не видел, чтобы в ветке про Ноду кто-то сказал: Асинхронность ноды помогла мне решить вот-эту-вот-ресурсоемкую-мега-задачу, и это не чатик.

    Я вам привел конкретный пример, где очевидно преимущество ассинхронного программирования.

    У нас, в компании, используется микросервисная архитектура, большинство микросервисов на nodejs.

    На основном нашем проекте полмиллиона уникальных посетителей в день auto.ria.com. И вначале мы программировали на PHP, и это было нелекгое время.
  • Node.js и переход с PHP на JavaScript
    +5
    вы искренне уверены, что асинхронность это какой-то эксклюзив для js?

    Вы перекручиваете мои слова. Просто в PHP нету ассинхронной организации кода, а в ноде это основной вид программирования. Это дает ряд преимуществ, которые описаны в несметном числе статей.
    А про экслюзив это уже вы дофантазировали.
    А в наличие в среднестатистическом приложении огромного куска логики, который будет выполняться во время ожидания ответов от базы и при этом не зависеть от нее чет не верится.

    Например у вас 10 сервисов и одна база, в ноде можно обратиться одновременно ко всем и к базе и обработать ответы или ошибки от сервисов ПАРАЛЕЛЬНО, одновременно. Суммарное время выполнения будет ровняться самому тормознутому сервису или долгому ответу от базы а не сумме обращений ко всем сервисам. Разницу чувствуете?
    да, если nodejs-приложение умеет обрабатывать больше одного соединения. ибо пхп приложение скорее всего будет обрабатывать одно соединение (если там не reactphp)

    nodejs однопоточный. нода будет обрабатывать абсолютно все соединения в одном потоке, при этом все обработчики могут взаимодействовать между собой. Это делает элементармым такю задачу как написание чата, например.
  • Node.js и переход с PHP на JavaScript
    +2
    Все разруливается не на уровне соединений а на уровне запросов. Приложению нужно выполнить запрос он обращается к модулю mysql, тот свою очередь смотрит есть ли у него свободный конекшн. Если есть по нему проходит запрос, если нет, запрос ожидает освобождения конекшна. Для приложения эта все выглядит как обычный запрос к базе (неважно побывал он в очереди или нет).

    Кроме того, ресурсы приложения, которое делает запрос используются намного оптимальнее чем при роботе с php, т.к. все запросы проходят ассинхронно, другими словами пока не возникнет событие «пришел ответ на запрос», ресурсы не заблокированы, как в случае с mysql. Для php же ожидание губительно, так как и процессорные и память, выделенная на исполнения кода, заблокированы до ответа MySQL. Поэтому nodejs-приложение, как правило, может обрабатывать намного больше одновременных соединений чем аналогичное php-приложение.
  • Node.js и переход с PHP на JavaScript
    +4
    В статье не написано о том что nodejs в отличие от php не запускается при каждом запросе, от стартует и обрабатывает события. Это существенно меняет разсклад как по производительности так и по архитектуре приложений.
    Многим известна ситуация «Too many connections» при работе с MySQL. Корень проблемы в том что на каждый запуск PHP скрипта устанавливается новый connection (по-другому никак). Если запросов привалило много, база уходит «в задумчивость» и это заканчивается ошибкой «Too many connections». Нода же позволяет выделить небольшой пул соединений, например, 10. И драйвер MySQL на своем уровне будет обеспечивать работу с базой приложения используя эти 10 конекшнов. При большой нагрузке, запросы будут становиться в очередь и разгребаться медленее, но приложение будет остатваться рабочим и «живым».
  • Go быстрее Rust, Mail.Ru Group сделала замеры
    0

    Ноду через модуль cluster балансировать не оптимально, для этого есть специально написанные инструменты nginx или haProxy. Поэтому по ноде тесты сомнительные.


    Попробуйте так, ставим ноду 8.5
    создаем index.js


    var http = require("http");
    var server;
    
    server = http.createServer();
    
    server.on('listening', function() {
        console.log(`Listening ${server._connectionKey}`);
    });
    
    var greetingRe = new RegExp("^\/greeting\/([a-z]+)$", "i");
    server.on('request', function(req, res) {
        var match;
    
        switch (req.url) {
            case "/": {
                res.statusCode = 200;
                res.statusMessage = 'OK';
                res.write("Hello World!");
                break;
            }
    
            default: {
                match = greetingRe.exec(req.url);
                res.statusCode = 200;
                res.statusMessage = 'OK';
                res.write("Hello, " + match[1]);
            }
        }
    
        res.end();
    });
    
    server.listen(8080, "127.0.0.1");

    Убираем балансировку и получаем тот же результат

  • Книга «Машинное обучение»
    +3

    Купил у них уже около 5 книг. Мне все ссылки на почту приходили, возможно у них проблема с отправкой почты на Ваш ящик. У меня ящик на gmail, с ним проблем нету.


    Тут не "лохотрон" а идеализированное представление о доставке контента через электронную почту. :)

  • Украина подверглась самой крупной в истории кибератаке вирусом Petya
    +1

    Согласно данным СБУ по вирусу Petya.A (состоянием на 21.00 по Киеву), вирус эксплуатирует уязвимость MS17-010
    Там есть рекомендации и ссылки на апдейты для всех версий Windows (на украинском)

  • Автопилот своими силами. Часть 1 — набираем обучающие данные
    0

    Очень впечатляет, продолжайте!

  • Урок photoshop. Как вырезать сложный объект из фона
    0

    Мне понравилось, очень познавательно. Кто, хоть раз верстал рекламу или дизайнил баннер, знает, как не просто сделать обрезку волос на портрете или вырезать из фона зверюшку.

  • Очередная node.js-библиотека…
    +1
    Мне стало интересно заглянуть в ядро koa и узнать, как реализована работа с Promise. Но я был удивлен, т.к. ядро осталось практически таким же, как в предыдущей версии. Авторы обеих библиотек express и koa одни и те же, неудивительно, что и подход остался таким же. Я имею ввиду структуру промежуточного ПО (middleware).

    koa принципиально отличается от express и подход там совершенно другой. Работа с промисами там сводится к тому что в обработчике запроса ассинхронные функции вызываются через async/await синтакс со всеми вытекающими плюшками.


    По поводу yeps-benchmark, там koa2 запускаеться через node-cluster, что на мой взгляд, не лучшее решение. И что пытаемся доказать, что роуты обрабатываються меделенее? Не спорю, но роуты это не часть koa, koa-router это сторонний middleware, роутинг не входит в базовую функциональность koa.


    Про простоту и элегантность я б еще поспорил. А ошибки как ловить?

  • Книга «Децентрализованные приложения. Технология Blockchain в действии»
    +3

    Никогда не интресовался Blockchain просто потому что для работы не нужно а для личного развития не хотел тратить на это время. Купил PDF-ку. Ликбез прошел успешно :) Интересна сама философия децетрализованых сетей.


    И поскольку я рыбак, то таким как я будет еще интересно узнать, что на обложке изображен
    розовый пилобрюх (Hoplostethus mediterraneus) или средиземноморский большеголов.


    Эта глубоководная рыба распространена в Атлантическом и в западной части Индийского океанов. Обитает на глубинах от 100 до 1175 метров. Розовый пилобрюх достигает в длину 42 сантиметров, имеет продолго-
    ватую форму тела, большие глаза и раздвоенный хвост.
    image

  • Еще один велосипед для борьбы с callback hell в JavaScript
    +2

    Еще про генераторы забыли. Они поддерживаться уже давно.

  • Распознавание чеков в Google Docs с помощью ABBYY OCR SDK
    0

    Если нужно поставить на поток попробуйте tesseract, там есть поддержка большого количества языков. Он, конечно же менее комфортен, но с подобным чеком справиться без поблем.


    Недавно обновились натренированные модели для многих языков

  • Предновогодний релиз API и портала Scorocode
    0

    :)
    Да, действительно, почему бы не использовать бесплатный Tesseract, установить нужные языки. Для многих документов этого было бы достаточно.

  • Нейронные сети на JS. Создавая сеть с нуля
    0

    Я недавно писал статью про машинное обучение на JS, там как раз очень нехватало такой теоретической части как у Вас. Я добавил линк на вашу статью. Очень хорошо и доступно получилось.

  • Нейронные сети на JS. Создавая сеть с нуля
    0

    Можете посмотреть еще мою статью:
    Нейронные сети на Javascript

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    0

    User.findById синхронный?

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    +1

    В том то и дело что async/await выглядит как синхронный код а выполняется асинхронно.


    Другими словами когда вы ждете ответа с базы вы не блокируете поток. В этот момент ваше приложение может обрабатвать другие запросы от пользователей.

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    +1

    А если вам нужно проверить не случилось ли ошибки при получении данных из базы
    try {
    user = await getUser();
    } catch (err) {
    // Error handling
    }
    Вы представляете во что превратиться Ваш код?


    async/wait это отличная конструкция для написания человек-читаемого и легко понимаемого кода. Потому что код выглядит как синхронный а виполняется асинхронно.


    Ваше заявление "С Promise получается короче" работает только для примитивных конструкций, для более сложных это не всегда справедливо

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    0

    Чтоб не блокировать исполнение других обработчиков. Например к вашему web-серверу пришло несколько запросов.

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    +1

    Напишите аналог на промисах через рекурсию

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    0

    Напишите аналог на промисах, у вас тут "независимая" обработка кажного юзера.

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    0
    let user,spammers = [];
    do {
        user = await getUser();
        if (await isSpammer(user)) {
            spammers.push(user)
        }
    } while (spammers.length <= 10 && user !== null);
    console.log(spammers)

    Ну и все это, конечно, внутри асихронной функции.

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    +3

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


    Слабо?

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    0

    Это не драфт, предложение находится в Stage 3 ("Candidate"), в следующем месяце будет частью стандарта Stage 4 ("Finished").

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    0

    А если в цикле?

  • Node.js 7.0.0 зарелизился. Встречайте async/await без babel
    0

    Если речь идет о Windows:


  • Микросервисы: пожалуйста, не нужно
    0

    Как-то однобоко получилось.
    Есть монолит, есть сервисы, есть монолит+сервисы. И то, и то востребовано в разработке.

  • Быстрый рендеринг с DOM шаблонизаторами
    0

    Слайды презентации: http://www.slideshare.net/profyclub_ru/dom-aviasalesru (чтоб "руками" ссылки не набирать :) ).


  • Пишем микросервис на KoaJS 2 в стиле ES2017. Часть II: Минималистичный REST
    0

    В мире nodejs самая популярная ORM для mysql это драйвер MySQL :).


    У себя в компании мы не используем ORM. В этой статье мы говорим про микросервис, у которого, как правило, количество кода и таблиц небольшое, сам микросервис сильно "заточен" под базу с которой он работает. От него требуеться быстродействие и минимальное потребление ресурсов.


    Вот некоторые ORM, на которые когда-то смотрел:


  • Пишем микросервис на KoaJS 2 в стиле ES2017. Часть II: Минималистичный REST
    0

    Так в новой редакции у меня так и есть. Там роутер производит 2 разных middleware: 1 сами роуты, 2 заглушка, котрая правильно отвечает на вызов недопустимого метода. Но ее теретически можно не подключать, от этого REST сильно в функциональности не потеряет. В первой редакции это было не так, там эксортился инстанс роута, а он сам по себе middleware не является. Для генерации основного middleware у него надо вызвать метод router.routes()

  • Пишем микросервис на KoaJS 2 в стиле ES2017. Часть II: Минималистичный REST
    0
    GET /product — без пагинации, без вывода нужных полей, а сразу все…

    А вы что хотели чтоб я вам здесь фреймворк написал? В статье столько кода, сколько нужно для демонстрации подхода Koa 2.


    Сохранение данных модели без валидации.

    Вы, видимо, еще очень начинающий программист — там все есть. Если это не так напишите мне SQL-инъекцию для этого сервиса.


    Про модель Product я вообще молчу.

    Да вы не молчите, пишите, не стесняйтесь, может мы разберемся где у вас проблемы.

  • Такая разная асинхронность
    +1
    Примечательно, что этот модуль — обёртка над node-fibers.
    Так это еще один плюс в копилку async/await. Смысл для такой "крутой техногии" даунгрейдится в "более примитивную". Кроме того, из обсуждения ниже понятно, что замеры производительности сомнительны даже для babel.

    Лучше я напишу в одном месте Future.fromPromise( p ).wait(), чем буду по всему коду раскидывать async и await.
    Сомнительная красота.

    В том-то и дело, что он не добавляет никакого нового синтаксиса. Только апи для запуска и переключения волокон.
    А что api меняться не может?

    Как я обожаю эту толерантность. Обе технологии выполняют одну и ту же функцию. Только одна прямо, хоть и не стандарт, а другая криво, хоть и почти-вот-вот-стандарт.

    Тут "толерантность" не совсем подходит, синергия в случає с модулем обёрткой над node-fibers.


    У node-fibers есть сильные стороны, которые вы уже перечислили но есть проблемы:


    • Есть некий талантливый разработчик Marcel Laverdet, который это все кодит. Ему сейчас интересно, репозиторий живой, но сильная зависимость от одного разработчика это риск для технологии. Ведь не всем она нравиться и ваша голосовалка говорит о том что даже после ваших блестящих аргунетов лидирует async/await


    • Бинарный код модуля это тоже проблема, т.к. есть облачные хостинги и среды с ограниченными возможностями по компиляции, где Вы не сможете собрать node-fibers.


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