技术杂谈 零零碎碎的一些技术杂谈

Go netpoll I/O 多路复用构建原生网络模型之源码深度解析 置顶!

  |   0 评论   |   900 浏览

本文将基于 Linux 平台来解析 Go netpoll 之 I/O 多路复用的底层是如何基于 epoll 封装实现的,从源码层层推进,全面而深度地解析 Go netpoll 的设计理念和实现原理,以及 Go 是如何利用netpoll来构建它的原生网络模型的。主要涉及到的一些概念:I/O 模式、用户/内核空间、epoll、Linux 源码、goroutine scheduler 等等,我会尽量简单地讲解,如果有对相关概念不熟悉的同学,还是希望能提前熟悉一下。

gnet: 一个轻量级且高性能的 Go 网络框架 置顶!

  |   9 评论   |   7,447 浏览

gnet 是一个基于 Event-Loop 事件驱动的高性能和轻量级网络库。这个库直接使用 epollkqueue 系统调用而非标准 Golang 网络包:net 来构建网络应用,它的工作原理类似两个开源的网络库:libuvlibevent

这个项目存在的价值是提供一个在网络包处理方面能和 RedisHaproxy 这两个项目具有相近性能的 Go 语言网络服务器框架。

gnet 的亮点在于它是一个高性能、轻量级、非阻塞的纯 Go 实现的网络库。

两种方式迁移 Docker 的默认安装(存储)目录

  |   0 评论   |   573 浏览

前阵子我给自己的云服务器买了数据云盘挂载上去了,作为以后主要的存储那些占用磁盘比较大的数据,所以就想着把一些以前装在系统的根目录 / 下的一些软件的数据目录迁移到新的数据盘挂载的目录下,首先迁移的是 Docker,我的服务器系统发行版本是 Ubuntu-16.04。

Linux IO模式及 select、poll、epoll详解

  |   2 评论   |   9,892 浏览

注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。

同步 IO 和异步 IO,阻塞 IO 和非阻塞 IO 分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。

本文讨论的背景是 Linux 环境下的 network IO。

一 概念说明

在进行解释之前,首先要说明几个概念:

  • 用户空间和内核空间
  • 进程切换
  • 进程的阻塞
  • 文件描述符
  • 缓存 I/O

用户空间与内核空间

现在操作系统都是采用虚拟存储器,那么对 32 位操作系统而言,它的寻址空间(虚拟存储空间)为 4G(2 的 32 次方)。操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间。针对 Linux 操作系统而言,将最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF),供内核使用,称为内核空间,而将较低的 3G 字节(从虚拟地址 0x

次时代Java编程(一) Java里的协程

  |   0 评论   |   7,718 浏览

什么是协程(coroutine)

这东西其实有很多名词,比如有的人喜欢称为纤程(Fiber),或者绿色线程(GreenThread)。其实最直观的解释可以定义为线程的线程。有点拗口,但本质上就是这样。

我们先回忆一下线程的定义,操作系统产生一个进程,进程再产生若干个线程并行的处理逻辑,线程的切换由操作系统负责调度。传统语言 C++ Java 等线程其实与操作系统线程是 1:1 的关系,每个线程都有自己的 Stack, Java 在 64 位系统默认 Stack 大小是 1024KB,所以指望一个进程开启上万个线程是不现实的。但是实际上我们也不会这么干,因为起这么多线程并不能充分的利用 CPU,大部分线程处于等待状态,CPU 也没有这么核让线程使用。所以一般线程数目都是 CPU 的核数。

coroutine.png

传统的 J2EE 系统都是基于每个请求占用一个线程去完成完整的业务逻辑,(包括事务)。所以系统的吞吐能力取决于每个线程的操作耗时。如果遇到很耗时的 I/O 行为,则整个系

Lucene构建个人搜索引擎解析

  |   0 评论   |   10,321 浏览

Lucene 是什么?

Lucene 是 apache 软件基金会 4 jakarta 项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由[Apache](https://ba

MQ对比之RabbitMQ & Redis

  |   0 评论   |   6,453 浏览

消息队列选择:RabbitMQ & Redis

RabbitMQ

RabbitMQ 是一个由 erlang 开发的 AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ 是一个消息代理,从“生产者”接收消息并传递消息至“消费者”,期间可根据规则路由、缓存、持久化消息。“生产者”也即 message 发送者以下简称 P,相对应的“消费者”乃 message 接收者以下简称 C,message 通过 queue 由 P 到 C,queue 存在于 RabbitMQ,可存储尽可能多的 message,多个 P 可向同一 queue 发送 message,多个 C 可从同一个 queue 接收 message

RabbitMQ 架构:

img

NoSQL数据库的分布式算法

  |   0 评论   |   546 浏览

本文译自 Distributed Algorithms in NoSQL Databases
原文:NoSQL数据库的分布式算法

系统的可扩展性是推动 NoSQL 运动发展的的主要理由,包含了分布式系统协调,故障转移,资源管理和许多其他特性。这么讲使得 NoSQL 听起来像是一个大筐,什么都能塞进去。尽管 NoSQL 运动并没有给分布式数据处理带来根本性的技术变革,但是依然引发了铺天盖地的关于各种协议和算法的研究以及实践。正是通过这些尝试逐渐总结出了一些行之有效的数据库构建方法。在这篇文章里,我将针对 NoSQL 数据库的分布式特点进行一些系统化的描述。

接下来我们将研究一些分布式策略,比如故障检测中的复制,这些策略用黑体字标出,被分为三段:

  • 数据一致性。NoSQL 需要在分布式系统的一致性,容错性

Java I/O模型从BIO到NIO和Reactor模式解析

  |   0 评论   |   504 浏览

01308200580ZNcr.gif

Java I/O 模型

同步 vs. 异步

同步 I/O 每个请求必须逐个地被处理,一个请求的处理会导致整个流程的暂时等待,这些事件无法并发地执行。用户线程发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行。

异步 I/O 多个请求可以并发地执行,一个请求或者任务的执行不会导致整个流程的暂时等待。用户线程发起 I/O 请求后仍然继续执行,当内核 I/O 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞 vs. 非阻塞

阻塞 某个请求发出后,由于该请求操作需要的条件不满足,请求操作一直阻塞,不会返回,直到条件满足。

非阻塞 请求发出后,若该请求需要的条件不满足,则立即返回一个标志信息告知条件不满足,而不会一直等待。一般需要通过循环判断请求条件是否满足来获取请求结果。

需要注意的是,阻塞并不等价于同步,而非阻塞并非等价于异步。事实上这两组概念描述的是 I

Mac开发系列之python多版本和环境管理(pyenv和virtualenv安装配置使用)

  |   0 评论   |   823 浏览

系统版本:Mac OS X El Capitan(10.13)
预先安装:homebrew 安装方法:运行 Ruby 脚本:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

pyenv 依赖:python 2.5+ , Git

pyenv 安装

推荐使用 pyenv-installer 这个插件安装 pyenv,这种方式安装会多安装几个是实用的插件,比如:

pyenv-virtualenv 用于整合virtualenv

pyenv-pip-rehash 用于使用pip安装包之后自动执行rehash

pyenv-update 用于升级pyenv

使用python-installer方式安装:确保你的电脑可以访问Github,然后在终端运行:
curl -L https://raw.githubusercontent.com/yyuu/pyenv-ins

Goroutine 并发调度模型深度解析之手撸一个高性能协程池 置顶!

  |   33 评论   |   59,115 浏览

并发(并行),一直以来都是一个编程语言里的核心主题之一,也是被开发者关注最多的话题;Go 语言作为一个出道以来就自带 『高并发』光环的富二代编程语言,它的并发(并行)编程肯定是值得开发者去探究的,而 Go 语言中的并发(并行)编程是经由 goroutine 实现的,goroutine 是 golang 最重要的特性之一,具有使用成本低、消耗资源低、能效高等特点,官方宣称原生 goroutine 并发成千上万不成问题,于是它也成为 Gopher 们经常使用的特性。

Goroutine 是优秀的,但不是完美的,在极大规模的高并发场景下,也可能会暴露出问题,什么问题呢?又有什么可选的解决方案?本文将通过 runtime 对 goroutine 的调度分析,帮助大家理解它的机理和发现一些内存和调度的原理和问题,并且基于此提出一种个人的解决方案 — 一个高性能的 Goroutine Pool(协程池)。

G-P-M模型

数据库内部排序算法之两阶段多路归并排序算法实现

  |   0 评论   |   469 浏览

摘要: 两阶段归并排序算法是数据库查询的一个基础技术,在数据库应用中,常常采用“两阶段多路归并排序算法”来解决对海量数据的排序问题(这里的海量数据是指数据大小远远超过了数据库可用的主存的大小,无法将所有数据一次性的载入主存进行排序)。

前言

基于斯坦福大学的《数据库系统实现》,实现两阶段多路归并排序算法,通过 merge-sort 算法的实现,理解外存算法所基于的 I/O 模型与内存算法基于的 RAM 模型的区别;理解不同的磁盘访问优化方法是如何提高数据访问性能的。

首先生成一个具有 10,000,000 个记录的文本文件,其中每个记录由 100 个字节组成。实验只考虑记录的一个属性 A,假定 A 为整数类型。记录在 block 上封装时,采用 non-spanned 方式,即块上小于一个记录的空间不使用。Block 的大小可在自己的操作系统上查看,xp 一般为 4096 bytes。在内存分配 50M 字节的空间用于外部 merge-sort。要求设计和实现程序完成下列功能:

  1. 生成文本文件,其中属性 A 的值随机产生。
  2. 对文本文件中的记录,按照属性 A 进行排序,其中在第二阶段的排序中每个子列表使用一

64位Ubuntu14.04下安装hadoop2.6单机配置和伪分布配置详解

  |   0 评论   |   331 浏览

环境

系统: Ubuntu 14.04 64bit

Hadoop 版本: Hadoop 2.6.0 (stable)

JDK 版本: oracle jdk7

操作

在 Ubuntu 下创建 hadoop 用户组和用户

  1. 创建 hadoop 用户组
sudo addgroup hadoop
  1. 创建 hadoop 用户
sudo adduser -ingroup hadoop hadoop

3 . 给 hadoop 用户添加权限,打开/etc/sudoers 文件

sudo gedit /etc/sudoers

在 root ALL=(ALL:ALL) ALL 下添加 hadoop ALL=(ALL:ALL) ALL.

安装 SSH server、配置 SSH 无密码登陆

SSH 是一个很著名的安全外壳协议 Secure Shell Protocol。 rsync 是文件同步命令行工具

sudo apt-get install ssh rsync

网络爬虫详解与python实现

  |   0 评论   |   451 浏览

网络爬虫是捜索引擎抓取系统的重要组成部分。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份。这篇博客主要对爬虫以及抓取系统进行一个简单的概述。

网络爬虫的基本结构及工作流程

一个通用的网络爬虫的框架如图所示:

image

网络爬虫的基本工作流程如下:

  1. 首先选取一部分精心挑选的种子 URL;
  2. 将这些 URL 放入待抓取 URL 队列;
  3. 从待抓取 URL 队列中取出待抓取在 URL,解析 DNS,并且得到主机的 ip,并将 URL 对应的网页下载下来,存储进已下载网页库中。此外,将这些 URL 放进已抓取 URL 队列。
  4. 分析已抓取 URL 队列中的 URL,分析其中的其他 URL,并且将 URL 放入待抓取 URL 队列,从而进入下一个循环。

从爬虫的角度对互联网进行划分

对应的,可以将互联网的所有页面分为五个部分:

![image](https://taohuawu.club/upload/2018

Ubuntu下通过PPA仓库安装JDK

  |   0 评论   |   306 浏览

摘要: 在 Ubuntu14.04 下通过 PPA 仓库安装 JDK,这样就无需自己配置环境变量,完全自动配置好,比较方便,而且还可以保持 JDK 的版本是最新的.

在我们继续了解如何安装 Java 之前,让我们快速地了解 JRE、OpenJDK 和 Oracle JDK 之间的不同之处。

JRE(Java Runtime Environment),它是你运行一个基于 Java 语言应用程序的所正常需要的环境。如果你不是一个程序员的话,这些足够你的需要。

JDK 代表 Java 开发工具包,如果你想做一些有关 Java 的开发(阅读程序),这正是你所需要的。

OpenJDK 是 Java 开发工具包的开源实现,Oracle JDK 是 Java 开发工具包的官方 Oracle 版本。尽管 OpenJDK 已经足够满足大多数的案例,但是许多程序比如 Android Studio 建议使用 Oracle JDK,以避免 UI/性能问题。

检查 Java 是否已经安装在 Ubuntu 上
打开终端,输入以下命令:

java -version

如果有看到类似以下的输出,则表明你的电脑上已经安装好了 JDK,否