4.21-5.6周记

trashes

1
2
3
4
5
6
7
8
9
10
11

string addslashes ( string $str )

返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。

preg_replace — 执行一个正则表达式的搜索和替换
说明

mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

搜索subject中匹配pattern的部分, 以replacement进行替换。

PHP-RdKafka 有延时问题

作者说是因为没有持久链接,所以会出现推卡夫卡之后会有延迟的现象。量级小还可以 但是量大了之后就很难说。会极大的拖慢php-fpm

Vbird-PHP-var 的变化

PHP5会出现的写时复制 在PHP7中有所改善,改善的目的就是为了节约内存

PHP改进的宗旨就是 更好的缓存友好度 更低的内存使用 更少的操作数

当在php5中 这样写是很大性能缺憾的

1
2
3
4
5
6
7
8
9
<?php

$arr = range(1, 10000);

$ref_arr = &$arr; // arr被当做了引用 php5的耿直cow导致性能--

foreach($arr as &item) {}

// 以上代码在PHP7的性能是PHP5的10000倍左右

为什么会出现这种情况呢?

因为首先PHP7对COW做了优化,不再真正的在引用的时候copy内存

且PHP7对变量的结构体做了优化,结构体由三个Union组成,占24字节

而PHP5的结构体实际占32字节,稍微操作之后大概占48字节,很消耗内存。

Go-sync.Map

只有Go1.9以上才有的特性

Go的Map并不是线程安全的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package main
func main() {
m := make(map[int]int)
go func() {
for {
_ = m[1]
}
}()
go func() {
for {
m[2] = 2
}
}()
select {}
}

在Go1.9之前,有这样的解决方案 直接对map增加一个sync.Mutex锁进行修补 使其达到线程安全

1
2
3
4
var counter = struct{
sync.RWMutex
m map[string]int
}{m: make(map[string]int)}

它使用嵌入struct为map增加一个读写锁。

读取数据的时候能够很方便的加锁

1
2
3
4
counter.RLock()
n := counter.m["some_key"]
counter.RUnlock()
fmt.Println("some_key:", n)
1
2
3
unter.Lock()
counter.m["some_key"]++
counter.Unlock()

可以说,上面的解决方案相当简洁,并且利用读写锁而不是Mutex可以进一步减少读写的时候因为锁带来的性能。

但是,它在一些场景下也有问题,如果熟悉Java的同学,可以对比一下java的ConcurrentHashMap的实现,在map的数据非常大的情况下,一把锁会导致大并发的客户端共争一把锁,Java的解决方案是shard, 内部使用多个锁,每个区间共享一把锁,这样减少了数据共享一把锁带来的性能影响,orcaman提供了这个思路的一个实现: concurrent-map,他也询问了Go相关的开发人员是否在Go中也实现这种方案,由于实现的复杂性,答案是Yes, we considered it.,但是除非有特别的性能提升和应用场景,否则没有进一步的开发消息。

sync.Map的性能优化点?

空间换时间。 通过冗余的两个数据结构(read、dirty),实现加锁对性能的影响。

使用只读数据(read),避免读写冲突。

动态调整,miss次数多了之后,将dirty数据提升为read。

double-checking。

延迟删除。 删除一个键值只是打标记,只有在提升dirty的时候才清理删除的数据。

优先从read读取、更新、删除,因为对read的读取不需要锁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type Map struct {
// 当涉及到dirty数据的操作的时候,需要使用这个锁
mu Mutex
// 一个只读的数据结构,因为只读,所以不会有读写冲突。
// 所以从这个数据中读取总是安全的。
// 实际上,实际也会更新这个数据的entries,如果entry是未删除的(unexpunged), 并不需要加锁。如果entry已经被删除了,需要加锁,以便更新dirty数据。
read atomic.Value // readOnly
// dirty数据包含当前的map包含的entries,它包含最新的entries(包括read中未删除的数据,虽有冗余,但是提升dirty字段为read的时候非常快,不用一个一个的复制,而是直接将这个数据结构作为read字段的一部分),有些数据还可能没有移动到read字段中。
// 对于dirty的操作需要加锁,因为对它的操作可能会有读写竞争。
// 当dirty为空的时候, 比如初始化或者刚提升完,下一次的写操作会复制read字段中未删除的数据到这个数据中。
dirty map[interface{}]*entry
// 当从Map中读取entry的时候,如果read中不包含这个entry,会尝试从dirty中读取,这个时候会将misses加一,
// 当misses累积到 dirty的长度的时候, 就会将dirty提升为read,避免从dirty中miss太多次。因为操作dirty需要加锁。
misses int
}

扩展阅读

ISSUE-SVN锁了导致Jenkins无法集成

SVN的清理命令,我们经常会使用。这个命令的原理,我们还是有必要深究一下的。

当SVN改变你的工作拷贝(或是.svn中的任何信息),它会尽可能的小心。在进行任何修改操作时,SVN都会把日志记录到日志文件中,然后执行log文件中的命令,

并且执行过程中在工作拷贝的相关部分保存一个锁,防止SVN客户端在变更过程中访问工作拷贝。如果SVN的操作中断了(举个例子:进程被杀死了,机器死掉了),

日志文件会保存在硬盘上。通过执行日志文件,SVN可以完成上一次没有完成的操作,你的工作拷贝可以回到一致的状态。

这就是svn clean up命令的功能:它查找工作拷贝中的所有遗留的日志文件,删除进程中工作拷贝的锁。如果SVN告诉你工作拷贝中的一部分已经“锁定”了,

你就需要运行这个命令了。

ISSUE-Black Mac git-svn报错解决方案

1
2
3
4
5
6
7
8
9
10
11
12

Can't locate SVN/Core.pm in @INC (you may need to install the SVN::Core module) (@INC contains:

/usr/local/git/lib/perl5/site_perl /Applications/SourceTree.app/Contents/Resources/git_local/lib/perl5/site_perl /Library/Perl/5.18/darwin-thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2 /System/Library/Perl/5.18/darwin-thread-multi-2level /System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level /System/Library/Perl/Extras/5.18 .) at /Applications/SourceTree.app/Contents/Resources/git_local/lib/perl5/site_perl/Git/SVN/Editor.pm line 5.

BEGIN failed--compilation aborted at /Applications/SourceTree.app/Contents/Resources/git_local/lib/perl5/site_perl/Git/SVN/Editor.pm line 5.

Compilation failed in require at /Applications/SourceTree.app/Contents/Resources/git_local/libexec/git-core/git-svn line 81.

BEGIN failed--compilation aborted at /Applications/SourceTree.app/Contents/Resources/git_local/libexec/git-core/git-svn line 81.

Completed with errors, see above

首先百度解决办法

1
2
3
4
5
sudo ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.18/darwin-thread-multi-2level/SVN/ /Library/Perl/5.18/SVN

sudo mkdir /Library/Perl/5.18/auto

sudo ln -s /Applications/Xcode.app/Contents/Developer/Library/Perl/5.18/darwin-thread-multi-2level/auto/SVN/ /Library/Perl/5.18/auto/SVN

 

但是没有XCODE 只在黑苹果的时候装了Xcode command line

1
code-select —print-path

拿到相应的地址

1
/Library/Developer/CommandLineTools/Library/Perl/5.18/darwin-thread-multi-2level

用这个地址替换上面xcode就行

Go 一次性安装所有dependen

1
go get ./...

Go运行时堆栈分析 + dev-shm

Go的内存分配器主要也是解决小对象的分配管理和多线程的内存分配问题。内存分配器以32k作为对象大小的定夺标准,小于等于32k的内存对象一律视为小对象,而大于32k的对象就是大对象了。

Cache、Central、Heap是三个核心组件

posted @ 2018-09-10 23:34  guoguoqingzhe  阅读(121)  评论(0编辑  收藏  举报